我是有工作的,应使用表中的默认值的问题,开发人员的讨论。是否有这样的硬性规定或者是它的最佳做法的灰色地带?

有帮助吗?

解决方案

我的规则:如果多条记录将使用默认的(至少在初期),那么我喜欢用它作为默认。例如,在一个在线商店产品的图像表可能有images/NoPictureYet.png的默认路径。最终,这些都将被替换,但对于其中的图片根本不存在数据的批量加载,但(也许大多数永远不会!),默认的是有道理的(对我来说,至少)。

如果没有合理的默认(如客户数据库“名字” - 我不希望我的名字默认为“姓”),然后我让非空的,并没有默认 - 这是应用程序的责任以确保正确的值被输入。

但在这个没有硬性规定。这一切都变化了一点;)

其他提示

其中I个人发现很好用默认值的一个实际情况下为last_modified柱。

此柱从未被存储的过程或业务逻辑更新,但得到由触发器自动更新时在所述行改变的任何值。然而,它也被设置为默认GETDATE()使得新行的值将包含的时间戳,当它被创建,它基本上是何时最后修改。

ALTER TABLE users ADD CONSTRAINT dc_users_last_modified
                  DEFAULT GETDATE()
                  FOR last_modified;

然后更新触发器看起来就像是这样的:

CREATE TRIGGER trigUpdate_users 
ON users 
FOR UPDATE 
AS 
BEGIN 
    IF NOT UPDATE(last_modified) 
        UPDATE users SET last_modified = GETDATE() 
        WHERE user_id IN (SELECT user_id FROM inserted);
END 
GO

没有硬性规定均可适用。这取决于列。这可能是完全明智的有一个默认的订单类型,例如,但一个客户电话号码的默认的想法是没有意义的。

我会说其为灰色区域。通常我不会设计有很多默认值的一个新的数据库,但你经常需要增强现有系统时使用它们。

例如增加一个新的非空列到现有的数据库。你可能不希望(或能够)更新所有插入到该表中的代码,那么你就需要把默认的就可以了,以确保任何“传统”代码仍可以插入数据(假设默认值是合适的对于课程的遗留代码)。

默认值是重要的,如果该列必须有一个值(不为空)。事实上,如果你是从允许空值更改列而不是让他们的默认值是非常必要的,因为不是所有的现有代码可以填入值。有时,在这种情况下,默认值是一样的东西“未知”。如果你想使用WITH VALUES提供的默认值来exisiting记录中,其中字段是在更改列到NOT NULL

ALTER TABLE语句空时尤其如此

默认值对于该用户界面通常不处理的字段是至关重要的。例如,我们有用户甚至从未知道有没有date_inserted和user_inserted列的缺省值。这是特别重要的,如果许多不同的应用可以填充数据,以确保没有人忘记有关这些列。

然后有其通常给定的数据项的值,其可以稍后更改列。事情是这样一个状态栏。

许多列不能真正有一个默认虽然。什么是用户的默认地址或名称?

<强> TL; DR:默认值是业务逻辑,我想在对象模型中的业务逻辑。这样,数据库不能包含默认值。

E.g。在数据库中,我有一个位字段:IsANicePerson。此字段转换为在Person类的属性。作为天性乐观,我想这个属性的默认值是“真”。因此,在Person类我实现这个(为isANicePerson支持字段的默认值)。如果我将允许在数据库中的默认值我会重复这个逻辑。重复的代码/逻辑是坏的。因此,我反对为默认值。

免责声明:我住在一个面向对象的世界中,并使用LINQ2SQL

它应该是相当简单的。如果数据通常应该像客户的电话号码或默认值会随时间而最有可能的变化,那么我会不会用它的每一行唯一的。这意味着它是真的只用于填充CREATEDATE,ModifiedDate,或这种性质的其它列有用的。

下面是我个人使用就已经使我受益匪浅,在过去的缺省值的准则。在下面的例子中,考虑与到后端的读/写访问多个应用程序的数据库后端。在这种情况下,重要的是定义数据库中数据是如何进行建模,因此保证数据的完整性。

1)CreatedDate和ModifiedDate列。这些柱通常具有GETDATE定义为默认()(SQL服务器)。正如在其他职位提到的,这些字段然后可以用触发器等更新。

2)的布尔状态列。例子: “ISDEFAULT”, “请将isDeleted”(审核), “IsActive” 等。所有这些领域的一般都会有这应该由数据模型定义的逻辑默认状态。例外情况显然是可空的三态布尔字段,其中所述空状态表示一些有关存储在该记录的数据。

3)数据约束定义:与允许为空=假并且没有定义默认列。换言之,由应用程序所需要的值。

4)查找表的外键的身份:这可能是不规范的做法,但对于查找表的外键的很多,我会定义一个默认的,涵盖了记录的初始状态。因此,例如,在“事件”表的外键列“EventTypeId”(INT-自动增量)将默认为1,表示“一般”或什么的。这将覆盖大部分场景中,比如,我想记录一个事件,但不与特定类型的ID护理。

5)非关键字符串列:“描述”等“注释”对于这些列我将通常限定“”作为默认纯粹simpify System.DbNull =>空转换在应用程序中处理。这是什么,可能不会在所有情况下适用特别是当涉及的表包含数百万行和存储空间是一个问题。

因此,在总结,使用默认值,以确保存储在数据库中的实际数据的数据完整性。数据模型应该定义中本身和与它交互的任何应用程序,这些数据的完整性规则和应该被强迫遵守这些规则。同时请注意,这不是教条,并且总是会有例外。单独考虑每个方案,这样是有意义的,你的数据库/应用程序。

绝对是灰色区域。这是一个经典的多少业务逻辑放到数据库的问题。

如果我们要的是纯粹的,并说没有业务逻辑在数据库中属于那么答案将永远不会用到它们。

作为实际我们可以使一个例外,因为我们经常做,并允许一个默认的逻辑到数据库中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top