代码之家  ›  专栏  ›  技术社区  ›  Zack Peterson

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

  •  4
  • Zack Peterson  · 技术社区  · 17 年前

    我正在设计这个类和抽象(mustinherit)类集合

    class diagram

    这是数据库表,我将在其中存储所有这些_

    database table

    据Microsoft SQL Server数据库所知,这些都是可以为空(“allow nulls”)的列。

    但实际上,这取决于存储在那里的类:linknode、htmlpagenode或codepagenode。

    规则可能看起来像这样…

    rules table

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


    更新:关于此单表设计…

    我仍在努力寻找最终的建筑。

    最初,我使用了许多几乎为零的空字段的小表。
    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?

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

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

    11 回复  |  直到 17 年前
        1
  •  2
  •   Oded    17 年前

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

    Books Online 地点:

    可以使用创建检查约束 任何逻辑(布尔)表达式 基于 逻辑运算符。对于上一个 例如,逻辑表达式是: 工资=15000,工资=100000。

        2
  •  2
  •   Troy DeMonbreun    17 年前

    看起来你在尝试 Single Table Inheritance 模式,这是本书“对象关系结构模式”一节所涵盖的模式。 Patterns of Enterprise Application Architecture .

    我会推荐 Class Table Inheritance Concrete Table Inheritance 如果您希望通过SQL表约束强制数据完整性,则使用模式。

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

        3
  •  2
  •   artur02    17 年前

    你可以设置一些 插入/更新触发器 . 检查这些字段是否 无效的 非零 ,并根据需要拒绝插入/更新操作。如果要将所有数据存储在同一个表中,这是一个很好的解决方案。

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

        4
  •  2
  •   Stephen Wrighton    17 年前

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

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


    编辑

    在这种情况下,您可以a)使用逻辑约束(见下文)或b)存储过程执行插入/编辑(不管怎样,这是一个好主意),或者c)再次执行,只需使类强制实现数据完整性。

    我参加的活动将是C&B的混合体。对于每个节点类型(即insert_update_nodeType),我将拥有唯一的添加/编辑存储过程,并使类在保存数据之前执行数据验证。

        5
  •  2
  •   HLGEM    17 年前

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

        6
  •  1
  •   Alexandra Franks    17 年前

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

        7
  •  1
  •   Community CDub    8 年前

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

        8
  •  1
  •   Jacob Schoen    17 年前

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

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

        9
  •  1
  •   Munish Garg    7 年前

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

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

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

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

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

    @扎克:你也可以查看这个博客来阅读关于数据完整性强制的更多细节,这里- https://www.bugraptors.com/what-is-data-integrity/

        10
  •  0
  •   Martin Marconcini    17 年前

    SQL Server对您的类一无所知。我认为您必须通过使用一个工厂类来实现这一点,该类为您构造/解构所有这些内容,并确保根据类型传递正确的值。

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

    另一个想法可能是研究执行相同操作的SQL函数和存储过程。但不能强制一个字段不为空(对于一条记录)和空(对于下一条记录)。这是您的业务层/工厂工作。

        11
  •  0
  •   artur02    17 年前

    你试过了吗? NHibernate ?它比实体框架成熟得多。它是免费的。