3

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

类图

这是我要存储所有这些的数据库表……</p>

数据库表

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

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

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

规则表

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


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

我仍在尝试将最终架构归零。

我最初从许多具有几乎为零的 nullalbe 字段的小表开始。
哪个是我导航的最佳数据库架构?

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

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

现在我试图用一个类和抽象类的集合来处理它。
请帮助我处理我的 .NET 抽象类。

4

11 回答 11

2

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

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


编辑

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

C&B的混合将是我所采取的事件过程。我将为每个节点类型(即 Insert_Update_NodeType)添加/编辑独特的存储过程,并让类在保存数据之前执行数据验证。

于 2008-09-17T18:35:34.060 回答
2

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

在线图书网站:

您可以使用基于逻辑运算符返回 TRUE 或 FALSE 的任何逻辑(布尔)表达式创建 CHECK 约束。对于前面的示例,逻辑表达式是:salary >= 15000 AND Salary <= 100000。

于 2008-09-17T18:46:53.940 回答
2

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

如果您希望通过 SQL 表约束强制数据完整性,我会推荐类表继承具体表继承模式。

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

于 2008-09-17T18:47:18.383 回答
2

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

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

于 2008-09-17T18:50:15.910 回答
2

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

于 2008-09-17T22:17:49.157 回答
1

这可能不是你想听到的答案,而是避免逻辑不一致的最好方法,你真的想看看数据库规范化

于 2008-09-17T18:38:06.067 回答
1

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

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

于 2008-09-17T18:40:20.087 回答
1

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

于 2008-09-17T18:46:46.577 回答
1

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

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

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

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

  3. 参照完整性关注的是保持表之间的关系同步。

@Zack:您还可以查看此博客以阅读有关数据完整性执行的更多详细信息,请点击此处 - https://www.bugraptors.com/what-is-data-integrity/

于 2018-08-30T11:41:31.550 回答
0

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

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

另一个想法可能是探索做同样事情的 SQL 函数和存储过程。但是,您不能强制一个字段对于一条记录为 NOT NULL,而对于下一条记录为 NULL。那是您的业务层/工厂工作。

于 2008-09-17T18:38:13.583 回答
0

你试过NHibernate吗?它是比实体框架更成熟的产品。免费。

于 2008-09-17T19:19:41.427 回答