表中的域约束重复

时间:2010-02-15 12:50:45

标签: .net sql database-design

我正在设计一个数据库来保存我的域对象。我对对象有各种验证规则,例如字符串长度以及是否必须填充。这些东西都在C#代码中检查。 在数据库中复制这些规则是否有意义,例如设置nvarchar(150)而不是nvarchar(max),并为我知道必须输入的字段设置nullable为false?

我不这么认为,因为在将数据存储到数据库中时,数据应该已经过验证,并且必须将要求的更改保留在两个地方而不是一个地方。

请分享您的想法。

6 个答案:

答案 0 :(得分:3)

正确设置您的数据类型 - 可空,大小等都值得设置,因为它们可以确保您的数据真正正确并且可能更有效。这也是一件相当“便宜”的事情;写作varchar(150)varchar(max)

并不需要花费更多精力

生成更复杂的规则 - 字符串必须与正则表达式匹配,或者数字必须在某个范围内 - 可能不值得,除非您可以生成c#验证函数和表约束单一来源描述,例如Microsoft Oslo。拥有单一系统的好处是您可以在所有级别生成验证;如果需要,在数据库,C#服务器代码和Javascript Web客户端代码中。不过,这只能在复杂的数据库上获得回报。

答案 1 :(得分:2)

我们一直在努力解决同样的问题。我们基本上得出的结论是,如果数据库中的数据可以被修改的唯一方法是通过您的应用程序,那么就不必将数据库中提到的检查放在数据库中。但是,如果允许用户直接访问数据库并进行修改,则还需要在数据库中进行验证。

答案 2 :(得分:2)

在编写第二个和第三个应用程序并写入同一个数据库之前,它会持续多长时间?如果您确定答案是“永远不会发生”,那么只需将验证留在应用程序中即可。如果没有,您最好将验证放在数据库中。在某些情况下,将验证放在两个地方都没什么大不了的。

答案 3 :(得分:1)

我会在数据库中放置简单的规则,这些规则可以通过数据库的自然约束轻松实施,例如NULL / NOT NULL,外键约束等。

但我会在C#代码的域层中保留复杂的规则,例如:规则如下(如果填写了字段A,字段B必须为空白)。

但是就字符串长度而言,我肯定会在数据库定义中设置正确的字符串长度,但出于不同的原因:它提供了更好的性能。 AFAIK nvarchar(max)实际上并不与所有其他数据物理存储在同一个表中,因此SQL服务器在检索数据时必须从光盘上的两个不同物理位置读取。

答案 4 :(得分:0)

除此之外,您还有机会表达您的代码想要对数据库中读回的任何实体做出的假设。正如其他人所说,如果有任何可能性(另一个人,另一个(后来的)系统)要对这些数据进行更改,而不是通过您的应用程序,那么您最好引导他们做正确的事情。因此将所需列标记为NOT NULL。如果您不希望描述列包含19世纪架构的论文,请将其标记为varchar(150),而不是varchar(max)等。

答案 5 :(得分:-1)

您永远无法确定您的应用程序是进行更新的唯一方式。

这就是约束强制属于DBMS的原因。

如果您想避免“必须在两个不同的地方进行维护”,请将约束强制保留给DBMS,不要在应用程序代码中复制它。