如何在数据库中强制执行数据完整性规则?

时间:2008-09-17 18:32:30

标签: sql sql-server database database-design

我正在设计这个类和抽象(MustInherit)类的集合......

class diagram

这是我要存储所有这些的数据库表......

database table

就Microsoft SQL Server数据库所知,这些列都是可空的(“允许空值”)列。

但实际上,这取决于存储在那里的类:LinkNode,HtmlPageNode或CodePageNode。

规则可能如下......

rules table

如何在我的数据库中强制执行此类数据完整性规则?


更新:关于这个单表设计......

我仍然试图在最终架构上进行调整。

我最初从很多小桌子开始,几乎没有nullalbe字段 Which is the best database schema for my navigation?

我了解了LINQ to SQL IsDiscriminator属性 What’s the best way to handle one-to-one relationships in SQL?

但后来我了解到LINQ to SQL仅支持单表继承 Can a LINQ to SQL IsDiscriminator column NOT inherit?

现在我正试图用一组类和抽象类来处理它 Please help me with my .NET abstract classes.

11 个答案:

答案 0 :(得分:2)

为每种类型的节点都有一个唯一的表。

为什么不让你正在构建的类强制执行自己类型的数据完整性?

<小时/> 的修改

在这种情况下,你可以a)使用逻辑约束(见下文)或b)存储过程进行插入/编辑(无论如何都是好主意)或c)再次,只需使类强制数据完整性。

C&amp; C的混合物B将是我采取的事件的过程。我将为每个节点类型(即Insert_Update_NodeType)添加/编辑提供唯一的存储过程,并使类在保存数据之前执行数据验证。

答案 1 :(得分:2)

在表格上使用CHECK约束。这些允许您使用任何类型的布尔逻辑(包括表中的其他值)来允许/拒绝数据。

来自Books Online网站:

  

您可以使用创建CHECK约束   任何逻辑(布尔)表达式   返回TRUE或FALSE基于   逻辑运算符。对于以前   例如,逻辑表达式是:   工资&gt; = 15000和工资&lt; = 100000。

答案 2 :(得分:2)

看起来您正在尝试Single Table Inheritance模式,这是本书Patterns of Enterprise Application Architecture的对象 - 关系结构模式部分所涵盖的模式。

如果您希望通过SQL表约束强制执行数据完整性,我建议使用Class Table InheritanceConcrete Table Inheritance模式。

虽然这不是我的第一个建议,但您仍然可以使用单表继承,只需通过存储过程强制执行约束。

答案 3 :(得分:2)

您可以设置一些插入/更新触发器。只需检查这些字段是 null 还是 notnull ,如果需要,请拒绝插入/更新操作。如果您想将所有数据存储在同一个表中,这是一个很好的解决方案。

您也可以创建为每个类创建唯一表格。

答案 4 :(得分:2)

我个人总是坚持通过触发器或检查约束将数据完整性代码放在表本身上。原因是您不能保证只有用户界面才会更新插入或删除记录。你也不能保证有人可能不会写第二个sp来解决原始sp中的约束而不理解实际的数据完整性规则,甚至不能写它,因为他或她不知道sp的存在与规则。表通常受DTS或SSIS包,来自用户界面或查询分析器或查询窗口的动态查询的影响,甚至受运行代码的预定作业的影响。如果您没有将数据完整性代码放在表级别,那么您的数据迟早会有完整性。

答案 5 :(得分:1)

这可能不是你想听到的答案,但是避免逻辑不一致的最佳方法,你真的想看看database normalisation

答案 6 :(得分:1)

我对SQL Server并不熟悉,但我知道使用Oracle,您可以指定可用于执行所需操作的约束。我很确定你也可以在SQL服务器中定义约束。

编辑:我发现这个link似乎有很多信息,有点长,但可能值得一读。

答案 7 :(得分:1)

Stephen's答案是最好的。但是如果你必须,你可以添加一个检查约束HtmlOrCode列和其他需要更改的列。

答案 8 :(得分:1)

在数据库中加强数据完整性 基本上,数据完整性有四种主要类型:实体,域,引用和用户定义。

实体完整性适用于行级别;域完整性适用于列级别,引用完整性适用于表级别。

  1. 实体完整性可确保表没有任何重复的行,并且具有唯一标识。

  2. 域完整性要求一组数据值落在特定范围(域)内才能生效。换句话说,域完整性通过限制数据类型,格式或可能值的范围来定义给定列的允许条目。

  3. 引用完整性与保持表之间的关系同步有关。

@Zack:您也可以在此博客中阅读有关数据完整性实施的更多详细信息,{-https://www.bugraptors.com/what-is-data-integrity/

答案 9 :(得分:0)

SQL Server对您的类一无所知。我认为您必须通过使用Factory类来强制执行此操作,该类为您构造/解构所有这些并确保您根据类型传递正确的值。

从技术上讲,这不是“在数据库中强制执行规则”,但我不认为这可以在单个表中完成。字段要么接受空值,要么不接受空值。

另一个想法可能是探索执行相同操作的SQL函数和存储过程。如果你不能强制一个字段为一个记录的NOT NULL而对下一个记录为NULL。那是你的业务层/工厂工作。

答案 10 :(得分:0)

你试过NHibernate吗?它比Entity Framework更成熟。它是免费的。