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

How do I enforce data integrity rules in my database?

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

class diagram

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

database table

据Microsoft SQL Server数据库所知,这些都是可空("允许空")列。

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

规则可能看起来像这样...

rules table

如何在数据库中实施此类数据完整性规则?

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

我仍在尝试将最终体系结构归零。

我最初从许多几乎零个nullalbe字段的小表开始。
哪种导航最适合我的导航?

我了解了LINQ to SQL IsDiscriminator属性。
在SQL中处理一对一关系的最佳方法是什么?

但是后来我了解到LINQ to SQL仅支持单表继承。
LINQ to SQL IsDiscriminator列不能继承吗?

现在,我尝试使用类和抽象类的集合来处理它。
请帮助我处理我的.NET抽象类。


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


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

您还可以为每个类创建一个唯一的表。


看起来您正在尝试"单表继承"模式,这是《企业应用程序体系结构的模式》一书的"对象关系结构模式"部分所涵盖的模式。

如果您希望通过SQL表约束来强制数据完整性,则建议使用"类表继承"或"具体表继承"模式。

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


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

从联机丛书网站:

You can create a CHECK constraint with
any logical (Boolean) expression that
returns TRUE or FALSE based on the
logical operators. For the previous
example, the logical expression is:
salary >= 15000 AND salary <= 100000.


对于每种类型的节点,都有一个唯一的表。

为什么不仅仅让您要构建的类为其自身类型强制实现数据完整性?

编辑

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

我将把C和B混合在一起。我将具有用于每个节点类型(即Insert_Update_NodeType)进行添加/编辑的唯一存储过程,以及使该类在保存数据之前执行数据验证。


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

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

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

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

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

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


    斯蒂芬的答案是最好的。但是,如果必须,您可以在HtmlOrCode列和其他需要更改的列中添加检查约束。


    我对SQL Server不太熟悉,但是我知道对于Oracle,您可以指定约束,这些约束可用于执行您想要的操作。我很确定您也可以在SQL Server中定义约束。

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


    这可能不是您想听到的答案,但是避免逻辑上不一致的最好方法是,您确实希望查看数据库规范化


    您是否尝试过NHibernate?它比Entity Framework成熟得多。免费。


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

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

    另一个想法可能是探索执行相同功能的SQL函数和存储过程。但是,您不能对一个记录强制将字段设置为NOT NULL,而对下一个记录将其设置为NULL。那是您的业务层/工厂工作。


    推荐阅读

      linux操作数据库命令?

      linux操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参

      linux数据库升级命令?

      linux数据库升级命令?,系统,信息,时间,最新,网络,名字,地址,管理,简介,传播,l

      数据库导出linux命令?

      数据库导出linux命令?,密码,数据,数据库,情况,地址,系统,工具,网上,名字,命

      linux恢复数据库命令?

      linux恢复数据库命令?,工具,系统,软件,数据,盘中,密码,命令,备份,数据库,文

      linux命令大全数据库?

      linux命令大全数据库?,服务,系统,平台,状态,软件,通用,环境,数据,神州,地址,

      linux上数据库的命令?

      linux上数据库的命令?,服务,系统,信息,地址,命令,密码,工具,管理,数据,单位,

      linux命令dm数据库?

      linux命令dm数据库?,地址,软件,时间,设备,名字,服务,位置,名称,公司,命令,lin

      linux数据库查找命令?

      linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,

      linux数据库同步命令?

      linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,D

      linux建立数据库命令?

      linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服

      linux命令进数据库?

      linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,

      linux数据库检查命令?

      linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,

      linux命令进去数据库?

      linux命令进去数据库?,地址,服务,名字,系统,数据库,工具,基础,工作,管理,网

      linux数据库基础命令?

      linux数据库基础命令?,地址,工作,基础,系统,命令,信息,情况,工具,设备,目录,l

      数据库导出命令linux?

      数据库导出命令linux?,数据,系统,名称,密码,软件,服务,情况,网上,工具,文件,L

      linux数据库删除命令?

      linux数据库删除命令?,软件,服务,产品,名称,系统,不了,地址,管理,电脑,命令,L

      linux数据库操作命令?

      linux数据库操作命令?,信息,系统,网络,地址,分析师,数据,名称,管理,基础,命

      linux连数据库命令?

      linux连数据库命令?,服务,地址,密码,名字,系统,软件,一致,命令,数据库,读法,

      备份数据库命令linux?

      备份数据库命令linux?,服务,网络,备份,数据,工具,设备,系统,一致,数据库,命

      linux登录数据库命令?

      linux登录数据库命令?,地址,系统,名字,服务,软件,标准,灵活,命令,数据库,读