我正在尝试为以下场景设计数据库模型:
一个人可以拥有一堆描述他或她的“属性”,每个属性都有许多预定义的“值”可供选择。属性的示例可以是'eyes'
,其可能的值为'hazel'
,'blue'
和'green'
。或'hair length'
与'very long'
,'long'
,'medium'
,'short'
,'very short'
,'none'
(是的,我知道现实生活中有比这更多种类,但让我们保持简单),
我提出了以下模型:
person_id, attribute_id
表中person_has_attribute_value
对的UNIQUE约束确保每个人的给定属性不超过一个值。我还希望能够添加/删除/修改属性及其可能的值而不会破坏数据完整性,因此所有关系在更新和删除时都有CASCADE
。
这应该相当不错,但是:
1。让我们说一些属性,我希望能够为一个人分配多个值。是否有办法仅对person_id, attribute_id
的某些值强制attribute_id
的唯一性(最好基于multiple BOOLEAN
表中的其他attribute
列)或者我是否需要完全这类案件的不同表格是什么?
2。假设某些属性没有预定义值,可以采用任意数值(例如:高度或重量)。有没有办法以某种方式将这些内容合并到现有结构中,同时保持做具有预定义值的那些属性的约束,或者我是否还需要另一组表用于此类情况?
答案 0 :(得分:0)
首先:到目前为止,我喜欢你的数据模型。
关于第2点:如果您愿意,可以使用相同的数据模型。如果属性高度[cm]'您需要值182,您可以使用该值在 attribute_value 中创建记录并使用它。但是,由于您要使用其他输入法(键入值而不是从列表中选择值),您需要属性中的标志来告诉您属性是固定列表属性还是一个自由变量属性。
关于第1点:这更难,因为这违反了您的约束。乍一看,您有两种选择:
但是,由于有三种类型的属性(单个固定,多个固定,单个变量),我们可以将其作为数据库中的主键(主键粗体)引入:
根据dbms,您现在可以有条件地检查唯一性。
例如在PostgreSQL中:
CREATE UNIQUE INDEX idx_unique_for_single_types ON person_has_attribute_value (person_id, att_type, att_no)
WHERE att_type IN ('SINGLE_FIXED','SINGLE_VAR');
注意,并非所有dbms都提供检查条件唯一性的方法。在某些情况下,您可能需要计算列或触发器或函数索引,而在其他情况下,此类选项可能不可用。我必须承认,我不知道MySQL是否有可能。
因此,如果这种不同的数据模型有所帮助,它将取决于dbms。也许你应该保持简单并坚持你所拥有的,将属性类型添加到属性以确定输入方法并删除唯一约束。