假设我们有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'?
真正的数据库结构有点复杂,并且有一些多对多关系,但这里的想法足以描述问题。
感谢任何帮助或指导!
答案 0 :(得分:2)
处理这些高阶完整性的唯一好方法是通过触发器或异常报告。如果您可以进行查询以检查问题,则几乎可以肯定将其转换为触发器。
答案 1 :(得分:1)
这是数据库内参照完整性不适合处理的问题。模式定义中的RI可以强制实体之间的直接关系,但它不能在同一个表中的其他记录(和它们的关系)之间的间接关系的一致性方面做很多事情。
处理此类要求的方法是在插入之前和更新触发器之前使用,以测试将要与同一父级下的其他记录一起写入的记录的一致性。如果您尝试将属性添加到不适用于文本框的文本框实例,则触发器将拒绝更新/插入并引发错误。
答案 2 :(得分:1)
嗯,这不是一件容易的事。但是,如果您要介绍它可能会有所帮助
每个元素类型的允许属性值列表 - 目录。
然后,将ElementTypeID
和PropertyID
传播到实际属性表中。
像
您也可以考虑为字符串,整数和数字设置单独的表 用于为每个实施数据类型的属性。