如何在我的数据库中强制执行数据完整性规则?
Posted
技术标签:
【中文标题】如何在我的数据库中强制执行数据完整性规则?【英文标题】:How do I enforce data integrity rules in my database? 【发布时间】:2008-09-17 18:32:30 【问题描述】:我正在设计这个类和抽象(MustInherit)类的集合……
这是我要存储所有这些的数据库表……
就 Microsoft SQL Server 数据库所知,这些都是可为空的(“允许 Nulls”)列。
但实际上,这取决于存储在那里的类:LinkNode、htmlPageNode 或 CodePageNode。
规则可能如下所示...
如何在我的数据库中执行此类数据完整性规则?
更新:关于这个单表设计...
我仍在尝试将最终架构归零。
我最初是从许多带有几乎为零的 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.
【问题讨论】:
【参考方案1】:对表使用 CHECK 约束。这些允许您使用任何类型的布尔逻辑(包括表中的其他值)来允许/拒绝数据。
来自Books Online 网站:
你可以创建一个 CHECK 约束 任何逻辑(布尔)表达式 返回 TRUE 或 FALSE 基于 逻辑运算符。对于上一个 例如,逻辑表达式是: 工资 >= 15000 AND 工资
【讨论】:
【参考方案2】:您似乎正在尝试Single Table Inheritance 模式,这是Patterns of Enterprise Application Architecture 一书的对象-关系结构模式部分所涵盖的模式。
如果您希望通过 SQL 表约束强制数据完整性,我建议您使用 Class Table Inheritance 或 Concrete Table Inheritance 模式。
虽然这不是我的第一个建议,但您仍然可以使用单表继承并通过存储过程强制执行约束。
【讨论】:
【参考方案3】:您可以设置一些插入/更新触发器。只需检查这些字段是 null 还是 notnull,并在需要时拒绝插入/更新操作。如果您想将所有数据存储在同一个表中,这是一个很好的解决方案。
您也可以为每个类创建一个唯一的表。
【讨论】:
【参考方案4】:对于每种类型的节点都有一个唯一的表。
为什么不让您正在构建的类对其自身类型强制执行数据完整性?
编辑
在这种情况下,您可以 a) 使用逻辑约束(见下文)或 b) 存储过程来执行插入/编辑(无论如何都是个好主意)或 c) 再次,只需让类强制执行数据完整性。
C 和 B 的混合将是我所采取的事件过程。我将为每个节点类型(即 Insert_Update_NodeType)提供唯一的添加/编辑存储过程,并让类在保存数据之前执行数据验证。
【讨论】:
【参考方案5】:就我个人而言,我总是坚持通过触发器或检查约束将数据完整性代码放在表本身上。原因是您不能保证只有用户界面会更新插入或删除记录。您也不能保证有人可能不会在不了解实际数据完整性规则的情况下编写第二个 sp 来绕过原始 sp 中的约束,甚至因为他或她不知道带有规则的 sp 的存在而编写它。表通常受到 DTS 或 SSIS 包、来自用户界面或通过查询分析器或查询窗口的动态查询,甚至是运行代码的计划作业的影响。如果不将数据完整性代码放在表级别,迟早你的数据将不具有完整性。
【讨论】:
我同意。在最低级别强制执行数据完整性是一种面向未来的形式。【参考方案6】:这可能不是你想听到的答案,而是避免逻辑不一致的最好方法,你真想看看database normalisation
【讨论】:
【参考方案7】:Stephen's 答案是最好的。但如果必须,您可以在 HtmlOrCode 列和其他需要更改的列中添加检查约束。
【讨论】:
【参考方案8】:我对 SQL Server 不是很熟悉,但我知道在 Oracle 中,您可以指定约束,您可以使用这些约束来执行您正在寻找的事情。我很确定你也可以在 SQL Server 中定义约束。
编辑:我发现这个link 似乎有很多信息,有点长,但可能值得一读。
【讨论】:
【参考方案9】:在数据库中强制执行数据完整性 基本上,数据完整性有四种主要类型:实体、域、引用和用户定义。
实体完整性适用于行级别;域完整性适用于列级别,引用完整性适用于表级别。
实体完整性确保表没有任何重复的行并且具有唯一性。
域完整性要求一组数据值位于特定范围(域)内才能有效。换句话说,域完整性通过限制数据类型、格式或可能值的范围来定义给定列的允许条目。
参照完整性关注的是保持表之间的关系同步。
@Zack:您还可以查看此博客以阅读有关数据完整性实施的更多详细信息,请点击此处-https://www.bugraptors.com/what-is-data-integrity/
【讨论】:
【参考方案10】:SQL Server 对您的类一无所知。我认为您必须通过使用为您构造/解构所有这些的工厂类来强制执行此操作,并确保您根据类型传递正确的值。
从技术上讲,这不是“在数据库中强制执行规则”,但我认为这不能在单个表中完成。字段要么接受空值,要么不接受。
另一个想法可能是探索执行相同操作的 SQL 函数和存储过程。但是,您不能强制一个字段对于一条记录为 NOT NULL,而对于下一条记录为 NULL。那是您的业务层/工厂工作。
【讨论】:
【参考方案11】:你试过NHibernate吗?它是比实体框架更成熟的产品。它是免费的。
【讨论】:
以上是关于如何在我的数据库中强制执行数据完整性规则?的主要内容,如果未能解决你的问题,请参考以下文章
Rails 方法用于两个相关连接表之间的关系并同时强制数据完整性