首页 / 知识
关于sql:如何在数据库中强制执行数据完整性规则?
2023-04-16 18:21:00
How do I enforce data integrity rules in my database?我正在设计此类和抽象(MustInherit)类的集合...
这是我要存储所有这些的数据库表…
据Microsoft SQL Server数据库所知,这些都是可空("允许空")列。 但实际上,这取决于存储在其中的类:LinkNode,HtmlPageNode或CodePageNode。 规则可能看起来像这样...
如何在数据库中实施此类数据完整性规则? 更新:关于这种单表设计... 我仍在尝试将最终体系结构归零。
我最初从许多几乎零个nullalbe字段的小表开始。
我了解了LINQ to SQL IsDiscriminator属性。
但是后来我了解到LINQ to SQL仅支持单表继承。
现在,我尝试使用类和抽象类的集合来处理它。 我个人始终坚持通过触发器或检查约束将数据完整性代码放在表本身上。原因是您不能保证只有用户界面会更新插入或删除记录。您也不能保证某人可能不会写第二个sp来绕过原始sp的约束而又不了解实际的数据完整性规则,甚至无法编写它,因为他或她不知道该sp存在规则。表通常受DTS或SSIS包,来自用户界面或通过查询分析器或查询窗口的动态查询,甚至受运行代码的计划作业的影响。如果您不将数据完整性代码放在表级别,则迟早您的数据将不具有完整性。 您可以设置一些插入/更新触发器。只需检查这些字段是否为null或notnull,并在需要时拒绝插入/更新操作即可。如果要将所有数据存储在同一表中,这是一个很好的解决方案。 您还可以为每个类创建一个唯一的表。 看起来您正在尝试"单表继承"模式,这是《企业应用程序体系结构的模式》一书的"对象关系结构模式"部分所涵盖的模式。 如果您希望通过SQL表约束来强制数据完整性,则建议使用"类表继承"或"具体表继承"模式。 尽管这不是我的第一个建议,但是您仍然可以使用"单表继承",并通过存储过程强制执行约束。 在表上使用CHECK约束。这些允许您使用任何类型的布尔逻辑(包括表中的其他值)来允许/拒绝数据。 从联机丛书网站:
对于每种类型的节点,都有一个唯一的表。 为什么不仅仅让您要构建的类为其自身类型强制实现数据完整性? 编辑 在这种情况下,您可以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操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参数,如何实现MySQL数据库的基本用法在linux下1、mysql all-databaselinux数据库升级命令?
linux数据库升级命令?,系统,信息,时间,最新,网络,名字,地址,管理,简介,传播,linux下手动更新locate所在数据库的指令updatedb为什么行不通_百数据库导出linux命令?
数据库导出linux命令?,密码,数据,数据库,情况,地址,系统,工具,网上,名字,命令,linux系统导出oracle数据库数据导出数据库对象在PL/SQL Developlinux恢复数据库命令?
linux恢复数据库命令?,工具,系统,软件,数据,盘中,密码,命令,备份,数据库,文件,linux如何恢复删除的文件1、接下来小编就给大家带来linux恢复误linux命令大全数据库?
linux命令大全数据库?,服务,系统,平台,状态,软件,通用,环境,数据,神州,地址,在Linux上用命令怎么连接数据库(linux连接oracle数据库命令)登录linux上数据库的命令?
linux上数据库的命令?,服务,系统,信息,地址,命令,密码,工具,管理,数据,单位,在Linux上用命令怎么连接数据库(linux连接oracle数据库命令)1、登linux命令dm数据库?
linux命令dm数据库?,地址,软件,时间,设备,名字,服务,位置,名称,公司,命令,linux创建dm数据库超时linux/sys下无法新建 方法如下打开c盘,在用户linux数据库查找命令?
linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,在linux中如何用命令查找文件在哪使用查找命令 “find”命令允许linux数据库同步命令?
linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,DB2数据库在linux操作系统的指令有哪些?1、linux系统常用操作命令linux建立数据库命令?
linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服务,linux中在shell中怎么创建一个数据库1、以下的文章主要讲述的是linux命令进数据库?
linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,主机,linux系统mysql数据库怎么进入数据库首先确保linux下mysql安linux数据库检查命令?
linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,在linux中,怎样查看Mysql服务运行状态?1、psaux或netstat-tlunpps