SQL最佳实践标识值硬编码

时间:2017-10-17 19:55:32

标签: sql-server identity-column

首先,我知道这是一个相当主观的问题,但我需要一些正式的文档来帮助我教育我的客户。

后台 - 一个包含数百个表和SP的大型企业应用程序,所有这些都使用标识列整齐地设计了规范化表和外键。

我们的客户有一些员工使用我们的生产Db的复制副本在Crystal企业中编写复杂的报告。

我们有表格可以存储我将其归类为' system'基本信息,例如办公地点列表或公司内部门,用户的标准角色集,其他对象的状态(开放/关闭等),基本上不会经常更改的数据。

问题 - 报表设计人员和财务分析师正在编写带有硬编码标识值的查询。像这样的东西

SELECT xxx FROM OFFICE WHERE OFFICE_ID = 6

我在这里大大简化了,但基本上他们在他们的程序中使用这些硬编码的int值。

对于SQL开发人员来说,这显然会让你 facepalm ,因为它只是一种内在的本能,不会这样做。

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

他们认为这样做很好,因为价值观永远不会改变,而且他们是正确的,在这个单一系统中,这些价值观不会发生变化,但是在多个环境中(分期/质量保证) / Dev)这些值可以并且绝对不同,使得它们的报告设计方法不可移植,只能在一个隔离的服务器环境中运行。

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

1 个答案:

答案 0 :(得分:4)

对我来说,你的报告作者最强烈的论据是你的倒数第二句" ......这些价值观可以并且绝对不同[在环境之间]"。这几乎是我对他们的回应的主旨。

当然,任何问题总是存在灰色区域。标识列基本上是magic numbers。它们对数据库有益...

  • 顺序
  • 快速搜索和加入,排序并创建

...但是有一个完全没有意义的缺点,实际上,随机分配(将插入一种方式排序到该表中,每行获得的标识与排序另一种方式不同)。因此,如果您需要查找类似的特定内容,它的常见用途还包括商业/自然/备用" key(例如,可能(一个完全构成的例子)[CategoryName]其中CatgoryName是短的,独特的和人类可读的,而。[CategoryId]是一个身份,但不是想要寻找的东西)

如果你有一个带有下拉菜单的网站,通常将自然键放入下拉列表的可见部分,并且代理/身份密钥在后端传递,对最终用户不可见。

当人们直接针对数据库编写查询时,这会变得有点棘手。如果他们是数据的所有者,他们可能会知道有关更大数据结构的事情,他们可以利用这些数据结构*咳嗽"聪明"方法。如果您知道密钥不会更改并且您知道这些值是什么,那么可能只会引用这些值。但是,再次,当他们查询不同的服务器时,它们会不同。

当然另一方面,如果你不希望他们使用身份值,你必须给他们另一种选择。如果您的表格中没有包含商家/自然/备用密钥,那么您将不得不在已经存在的地方添加一个。

此外,该备用密钥也是一个整数也没有错(也许你的办公室已经拥有公司范围的1,2,3等标识符),但关键是它'无论你在哪里运行查询,都是确定性的。