sql数据库设计中的默认值

时间:2010-07-12 20:50:35

标签: c# sql visual-studio linq-to-sql

为类似整数的字段提供默认值总是好的做法吗?我使用linq进行数据库访问。

5 个答案:

答案 0 :(得分:6)

只有在有意义的情况下才应提供默认值,即。如果您没有明确指定,则字段应具有特定值。例如。 “已创建”日期时间字段应具有GetDate()默认值,但“BirthDay”字段应该没有默认值。最好将字段设为NULLable并将其设置为NULL,而不是使用默认值。

在选择默认值时,字段的类型无关紧要。

答案 1 :(得分:3)

数据库中的默认值是双刃剑。通过消除显式设置值以创建记录的需要,它们可以使生活更方便。一旦建立它们,如果需要更改它们,很难跟踪这些值的依赖性。出于这个原因,我避免在数据库中使用默认值。

答案 2 :(得分:2)

如果这些字段必须具有某种值,并且默认值有意义,那么这是一个好主意。例如,名为personAge的字段可能没有默认值(您可以合理地假设所有person条记录具有相同的年龄,除非它们另有说明吗?)。让它可以为空可能更好,然后在丢失数据时处理错误。

答案 3 :(得分:2)

我假设您正在使用linq-to-sql(即使问题仅标记为linq)。

我肯定会建议不要在db中使用默认值。 linq-to-sql层(至少如果使用sqlmetal生成,我认为它对设计者来说是相同的)将不使用数据库中的默认值,而是使用C#类型的默认值 - 这意味着{{1对于数字类型。在这种情况下,具有默认值的代码不会引起混淆。

答案 4 :(得分:0)

可能需要数据库中的默认值,以确保所有记录在字段不存在时获取值,并且不应允许空值。有时,当字段从可空变为不可空时,可以添加默认值,以便为现有记录提供值。也就是说,只有在有意义的情况下才应用默认值。 RecordCreatedDate的默认值是有意义的,然后您知道它将填充应用程序是否知道填写字段。订单中项目数的默认值没有意义,如果未填写,则应向应用程序返回错误。

在我看来,使用默认值来避免在适合空值的情况下使用空值是一种非常糟糕的做法。如果你不知道它应该是什么,特别是将一个整数设置为默认值0是愚蠢和短视,因为可能有实际的0值。 Null表示未知,如果在数据输入时不能预期数据是已知的,则使列不可为空并将其置于默认值(尤其是整数和日期)是非常糟糕的做法。现在,在知道值之前,您不知道该值是真的为零还是仅为占位符。现在你必须编写特殊的规则来容纳假值(特别是如果你把假值放在'19000101'之类的日期)。永远不要在数据库中使用默认值,以避免出现可为空的列。