2017-10-17 65 views
4

首先,我知道这是一个相当主观的问题,但我需要某种形式的正式文件,以帮助我教育我的客户。SQL最佳实践标识值硬编码

背景 - 与数百个表和SP的大型企业应用程序,都规规矩矩地设计了标准化的表格和使用标识列的外键。

我们的客户有几个员工写的用我们的生产DB的复制副本的水晶企业复杂的报表。

我们有表格来存储我将其分类为“系统”基本信息的表格,例如公司位置或公司内的部门列表,用户的标准角色集合,其他对象的状态(打开/关闭等) ),基本上不经常改变的数据。

问题 - 该报告的设计师和金融分析师他们的写作里面用硬编码标识值的查询。这样

SELECT xxx FROM OFFICE WHERE OFFICE_ID = 6 

什么我大大简化了这里,但基本上他们都在用它们的程序内这些硬编码int类型。

对于SQL开发人员来说,看到这个会很明显会让你面对facepalm,因为它只是一种内建的本能而没有这样做。

然而,令人惊讶的是我找不到任何文档或甚至最佳实践文章为什么这不应该做。

他们会认为这样做很好,因为值永远不会改变,他们是正确的,在单一系统内,这些值不会改变,但是在多个环境(staging/QA/Dev)中,这些值可以和是完全不同的,它们的报告设计方法不可移植,只能在1个隔离的服务器环境中运行。

是否有任何SQL专家有更深入的信息/文章等,我可以用来帮助教育我的客户为什么他们应该避免这种做法?

回答

3

对我来说,对你的报告作者来说,最强烈的论据是你的第二个到最后一个句子“......这些价值观和环境之间可以完全不同”。这几乎是我对他们的回应的要点。

当然总是有灰色地带,任何问题。标识列本质上是magic numbers。他们有益处的是数据库......

  • 顺序
  • 快速排序,寻求和加入,创造

...但有缺点完全没有意义,并且实际上是随机分配的(将插入按照一种方式排列到该表中,每行得到的身份不同于按照其他方式排序的)。因此,如果你不得不寻找特定的东西,那么常见的用法还包括“商业/自然/替代”键(例如,可能(完全是一个例子)[CategoryName]其中CatgoryName是短的,独特的和人性化的可读,而。[CategoryId]是一个身份,但不是想要寻求的东西)

如果你有一个网站,例如下拉菜单,通常自然键会被放到下拉菜单的可见部分,而代理/身份密钥在后端传递,对最终用户不可见。

当人们直接对数据库写入查询时,这会有点棘手。如果他们是数据的拥有者,他们可能知道更大的数据结构,他们可以利用咳嗽“聪明”的方式。如果你知道键不会改变,而你知道这些值是什么,可能有一个情况只是引用那些。但是,如果在查询不同的服务器时它们会不一样,那也不是。

当然,另一方面是,如果你不想让他们使用身份值,你必须给他们一个选择。如果你的表没有包含一个业务/自然/备用密钥,你将不得不添加一个不存在的地方。

另外,这个备用密钥也不是一个整数(也许你已经在公司范围内有1,2,3个办公室的公司标识符),但重要的是,无论你在哪里运行,它都是确定性的您的查询。

+0

好的答案,我同意所有这一点,而且我们确实已经确切地描述了您已经描述的内容即ie。与匹配的Id/Name列对齐。试图让他们明白'SELECT ID从类别WHERE Name ='xxx''到一个变量中,并用它来代替,这是他们只是不明白的东西,因此拒绝,所以我希望有一个可以引导他们的可靠参考从一个大的权威,所以我可以说,不要这样做,因为这个:参考。启动一个新的Azure虚拟机和种子不同的表值和他们的报告崩溃,而我们的应用程序不会,很难得到这一点跨 – n4esa

+0

我明白你的意思是关于这个问题的权威性文章的缺乏。这不是*完全*你的问题,但在这篇文章中也有一些很好的回应:https://stackoverflow.com/questions/2001375/sql-avoiding-hard-coding-or-magic-numbers – Xedni