在哪里放置默认值和唯一约束,代码或SQL服务器?

时间:2008-12-10 17:44:22

标签: c# sql

我们正在设计一个新数据库,我想在一些输入中放置默认值等内容。有3种情况:

1:新值,created_date字段。进行插入时,列是否应该具有默认值?

2:更新值,updated_date fiels。我一直在考虑实现一个触发器,将其设置为getdate(),其他选项在代码中。

3:country_name与country_name,我们应该直接在表上强制执行一个唯一约束,还是确保代码执行此操作?

并且持续了一些主题,但我们在每个表中都有一个updated_by和created_by(int),它引用了user表中的user_id。是否值得努力实现这个fk。对所有表格的约束?

4 个答案:

答案 0 :(得分:5)

我的最佳实践:

  • 对于创建/上次更新的日期,它 取决于你是否打算使用 它们是您业务逻辑的一部分 - 如果仅用于审核,请在数据库上使用时间戳。如果 你有可能想要的机会 将它们作为业务属性公开, 它们应该用代码分配。

  • 唯一约束 - 我在数据库和代码中实现它们。这是备份验证规则的数据库的示例,在两个地方都定义它们并没有什么坏处。代码定义应该捕获并处理它们,但是如果代码无法捕获某些内容,那么您希望具有约束的安全网保持数据不被破坏。

答案 1 :(得分:3)

  1. created_date,updated_date :如果这些是纯审计列,显示所做的更改以及由谁 - 触发器是合适的。如果您的数据模型依赖于这些(可能是最近updated_date的记录被认为是当前的),那么您的应用程序应该这样做。然后,您的应用可以决定当前应该是什么,而不是将其硬编码到架构中,即根据服务器的当前时钟设置,它是“最后插入的记录”。

  2. 国家/地区表:是的,请使用唯一约束。如果没有它,您的数据(以及您的查询)将没有意义......您将获得意外的连接匹配,并且您将无法强制执行参照完整性。然后,您的应用程序可以可靠地依赖于它的唯一命名(例如,通过将它们存储在SortedList中)。

  3. 用户表的外键是。如果值得保存数据,那么值得确保它是有效的。

答案 2 :(得分:3)

约束必须至少在数据库中。如果你必须在代码中复制它们(或从数据库推断它们)以提供更好的用户体验,那就这样吧。

数据库必须一致。我浪费了太多时间来追踪“无效数据”导致的问题。

通过添加适当的约束并修复创建无效数据的任何应用程序来解决这些问题。我宁愿有10张票,因为有人无法保存发票(易于追踪),而不是一张票,因为不知何故报告得到了一个奇怪的价值,这是因为发票数据不好。

答案 3 :(得分:3)

尽可能多地放入数据库。如有必要,您仍然可以从应用程序中操作/查看,但这有助于数据完整性和未来的应用程序版本(即,您不必为将来的“Web应用程序”版本复制逻辑)。