假设我有一个应始终为大写的数据库列。
这里有几个想法:
1)创建一个列约束:col = UPPER(col)
2)创建一个插入/更新行触发器之前设置:col = UPPER(col)
通常对数据库数据的约束越多越好,而触发器可能是神秘而糟糕的。假设编写代码的开发人员在同一个组织中,因此他们编写的代码可以由我们修改。
你会使用哪种方法,为什么?
它必须是大写的,因为有问题的数据实际上总是大写的(它最初是由各种第三方以这种方式打印的)。对于此特定字段,大写与小写没有任何意义。
假设我有一个应始终为大写的数据库列。
这里有几个想法:
1)创建一个列约束:col = UPPER(col)
2)创建一个插入/更新行触发器之前设置:col = UPPER(col)
通常对数据库数据的约束越多越好,而触发器可能是神秘而糟糕的。假设编写代码的开发人员在同一个组织中,因此他们编写的代码可以由我们修改。
你会使用哪种方法,为什么?
它必须是大写的,因为有问题的数据实际上总是大写的(它最初是由各种第三方以这种方式打印的)。对于此特定字段,大写与小写没有任何意义。
这取决于为什么该列需要大写,但总的来说我会选择约束。
我不喜欢在将数据插入数据库时更改数据的东西。这意味着我写的内容与下次阅读的内容不匹配。
如果文本已由用户输入,请考虑添加一个包含大写版本的额外列。这样,您始终可以显示用户输入的文本
在大多数情况下,我会说(1),因为正如您所指出的,触发器通常可能是坏的/奇怪的(尽管并非总是如此)。但是在处理字符串区分大小写时,我倾向于将其视为一种特殊情况,并始终在沿途的每一步进行修复。我不确定我这样做有什么具体的理由,只是“感觉”是对的。可能是因为至少在我工作过的大多数环境中,从业务逻辑的角度来看FoO
always equals foo
always equals FOO
。
此外,在这种情况下,开发人员说“仅供参考,所有字符串都以大写形式存储在服务器上”似乎比每次忘记时都拍他们的手腕来减轻负担。这不像说“仅供参考,每次您将价格插入数据库时,都会添加销售税。”
这最好作为一个约束来实现,它可以避免额外的负载并做你想做的事——强制数据采用你需要的格式。
我认为在数据库中强制转换是错误的方法,因为可以在不丢失完整性的情况下转换的数据应该在数据库层中处理。如果案例无关紧要,则照此处理 - 约束有助于捕获错误。
添加不区分大小写的索引可能是更好的解决方案(参见数据库不区分大小写索引)
或者增加自动化测试的覆盖率,并避免生产服务器上的额外负载。
我还会考虑另一种方法 - 提供“表 API”,允许开发人员将值传递给存储过程(或其他),然后确保值在插入时为大写(根据您的示例)。我也会用一个约束来支持这一点(它可以帮助一件事的查询优化)并删除表上的直接更改权限——如果你不相信开发人员将所有插入都大写,那么你不应该相信他们始终使用 TAPI。
如果您可以在数据库的列约束中执行某些操作,而不是触发器,则通常首选它,因为它通常更快。如果您正在谈论通过应用程序强制执行,我不建议这样做。如果必须始终应用该规则,则它不应出现在数据库中以外的任何地方。除了您正在为其编写代码的应用程序之外,其他事物都可以更改数据库中的数据。数据完整性是数据库的责任,将代码保存在它所属的位置以避免出现问题。