如何在复杂的一对多关系中保证数据的完整性?

时间:2011-08-29 14:57:13

标签: database database-design

假设我们有4个表格如下所述:

Table 1: Element  
element_id [integer] (PK)  
element_name [varchar]

Table 2: Element_Property  
property_id [integer] (PK)  
element_id [integer] (FK to Element.element_id)  
data_type [integer]

Table 3: Page_Elements  
page_element_id [integer] (PK)  
element_type_id [integer] (FK to Element.element_id)  
element_name [varchar]

Table 4: Page_Elements_Property_Values  
property_value_id [integer] (PK)  
page_element_id [integer] (FK to Page_Elements.page_element_id)  
property_id [integer] (FK to Element_Property.property_id)  
value [varchar]

前两个表是元素及其值的定义表,而第三个和第四个表是实例表。

考虑上述表格之间的关系:如何按设计保证表4中的每个属性值( Page_Elements_Property_Values )引用表2中的属性( Page_Elements )中的元素类型拥有( Element_Property )?

我将举一个例子来解释它:
'TextBox'是一个元素,'Length'是'TextBox'的属性。 'Height'是其他元素的属性。 'MyTextBox'是'TextBox'类型的页面元素,现在......如何保证在表4( Page_Elements_Property_Values )中,我们不会有'Height'值指向'MyTextBox'?

真正的数据库结构有点复杂,并且有一些多对多关系,但这里的想法足以描述问题。

感谢任何帮助或指导!

3 个答案:

答案 0 :(得分:2)

处理这些高阶完整性的唯一好方法是通过触发器或异常报告。如果您可以进行查询以检查问题,则几乎可以肯定将其转换为触发器。

答案 1 :(得分:1)

这是数据库内参照完整性不适合处理的问题。模式定义中的RI可以强制实体之间的直接关系,但它不能在同一个表中的其他记录(和它们的关系)之间的间接关系的一致性方面做很多事情。

处理此类要求的方法是在插入之前和更新触发器之前使用,以测试将要与同一父级下的其他记录一起写入的记录的一致性。如果您尝试将属性添加到不适用于文本框的文本框实例,则触发器将拒绝更新/插入并引发错误。

答案 2 :(得分:1)

嗯,这不是一件容易的事。但是,如果您要介绍它可能会有所帮助 每个元素类型的允许属性值列表 - 目录。 然后,将ElementTypeIDPropertyID传播到实际属性表中。 像

这样的东西

enter image description here

您也可以考虑为字符串,整数和数字设置单独的表 用于为每个实施数据类型的属性。