我正在编写一个新的应用程序,我正处于设计阶段。一些 db 表需要有一个InsertedDate
字段,该字段将在插入记录时显示。
我正在考虑Default Value
将GetDate()
在应用程序中执行此操作比在数据库中设置默认值有优势吗?
我正在编写一个新的应用程序,我正处于设计阶段。一些 db 表需要有一个InsertedDate
字段,该字段将在插入记录时显示。
我正在考虑Default Value
将GetDate()
在应用程序中执行此操作比在数据库中设置默认值有优势吗?
我认为最好在 SQL Server 中将默认值设置为 GetDate(),而不是在您的应用程序中。您可以使用它来获取基于插入的有序表。如果您尝试从应用程序中设置它,这看起来像是一种开销。除非您想在插入时指定某个特定日期,否则我认为这会破坏它的目的。
如果您需要手动将记录插入数据库,如果您在应用程序中设置默认值以避免 NULL 引用,则需要记住设置此字段。
就个人而言,我更喜欢在可能的情况下在数据库中设置默认值,但其他人可能对此有不同的看法。
如果您在应用程序中执行此操作,则可以对其进行单元测试。在我从事的项目中,尤其是在使用 ORM 时,我们在代码中执行所有默认操作。
在设计时,我总是非常重视关注点分离,对我来说,在“数据库功能与应用程序功能”的背景下,归结为一个问题:“谁拥有数据?”。我一直认为我的代码拥有我的数据——而不是数据库。数据库只是数据的容器。这类似于说我拥有我的衣服,而不是我的梳妆台拥有我的衣服。我的梳妆台发挥着重要作用,让我的衣服有条不紊地摆放,但我始终是把衣服放进梳妆台的代理人,我负责他们的整理工作。
我相信很多人都会对这个类比有疑问,说现代数据库比我的梳妆台强大得多,但根据我的经验,我在数据库层中放置的功能越多,项目就越混乱,界限就越模糊数据和功能之间(例如数据库存储过程等)。诚然,你的例子是这个概念的一个简单例子,但一旦树立了先例,一切都会发生。
我想解决的另一件事是易用性因素。我拒绝这样的想法,因为特定的实现很方便(例如避免空值、不同的服务器时间等),所以我应该选择它。对我来说,选择这样的实现就等于说:“如果我的代码不起作用也没关系。我会避免使用我的代码,而不是修复它并使其变得健壮。”
我敢肯定,在很多情况下,可能是极端规模或由于其他业务需求,数据库层功能不仅是必要的,而且是必要的,但我的经验告诉我,你可以在代码中保留的功能越多,就越干净,更简单,更健壮您的应用程序将。