在数据库中使用默认值是不好的做法吗?

Lie*_*oen 21 database-design

代码不应该处理默认值而不是数据库吗?

mar*_*c_s 18

您在数据库中可以执行的任何操作通常都更加强大.如果您处理默认值,如果没有在您的应用程序中仅指定任何值,并且有人设法通过您的应用程序以其他方式连接到您的数据库(并相信我 - 用户尝试使用Excel或其他连接)工具) - 然后数据库是敞开的,用户可能会插入糟糕的数据.

参照完整性和检查约束也是如此.如果你试图在数据库中拥有尽可能多的约束,我相信你会更好 - 那么无论用户如何连接,如果他没有向你发送任何东西,你可以放入合理的默认值.

不要让应用程序处理您的检查 - 将其留给数据库!

此外,如果您不必指定所有"明显"默认值,例如"LastChangedOn"日期列的"getdate()"等,它会使您的SQL插入语句更加精简和更加精简.

  • jldupont:您多久更换一次数据库与更改代码的频率可能会破坏验证过程? (8认同)
  • jldupont-使用数据库特定的功能并没有锁定你.我见过人们不使用主键因为这个(有缺陷的)推理! (3认同)
  • @jldupont:默认值几乎可以在每个SQL数据库系统中移植.如果您担心您的应用程序依赖于数据存储(在某些情况下这是一个合理的问题),您应该考虑自己编写.但是,如果您要使用DBMS,请让DBMS完成它的设计工作. (3认同)

Ras*_*Kaj 7

这取决于您如何看待“默认”值。这样想:如果更改默认值会发生什么?如果应更新现有值,则默认值应仅存在于程序代码中,但如果应保留现有值,则应将默认值存储在数据库中。


Mat*_*tin 5

代码默认值更容易进行单元测试。

代码默认支持多种场景。数据库列默认值是一刀切的。例如,数据库列默认值可能会根据客户类型而有所不同。

DB 列默认值对于维护开发人员来说通常是不透明的,因为它们远离 INSERT 语句,而 INSERT 语句通常位于中间层代码、存储过程等中。无论哪种方式,默认值的存在或不存在都可能令人惊讶。

数据库列默认值可以保护数据库免受那些懒得填写默认值的客户端的影响,这是一种数据损坏形式。

客户端开发人员可以破坏这两种默认设置。在中间层使用有缺陷的默认值更容易为开发人员设置障碍。AFAIK,没有数据库允许您要求字段在插入时采用默认值。(编辑:触发器可以强制执行此操作,但您必须将默认值复制到触发器,并且触发器会用默认值覆盖任何插入的值)这可能很重要的一个示例是人们用于未知但未来的各种令牌日期,或未知但过去的日期,或者如果他们使用包含时间的 GETDATE() 或者如果他们使用包含年、月、日但没有时间的默认日期,则可能很重要。

我建议确保默认值存在于数据库中有意义的位置,但实际上不使用它们。数据库默认值应该是最后手段的默认值,并且默认值应该牢固地位于中间层(即存储过程,数据访问层)。数据库列默认值就像一个异常处理程序——当有人意外忘记提供值时,应该使用什么值来防止数据损坏?