Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 条件唯一/FK约束_Mysql_Sql_Database Design_Relational Database - Fatal编程技术网

Mysql 条件唯一/FK约束

Mysql 条件唯一/FK约束,mysql,sql,database-design,relational-database,Mysql,Sql,Database Design,Relational Database,我正在尝试为以下场景设计一个数据库模型: 一个人可以有一系列描述他或她的“属性”,每个属性都有一些预定义的“值”可供选择。属性的一个示例可以是'eyes',其可能值为'hazel','blue'和'green'。或者'hair length'与'very long','long','medium','short','very short','none'(是的,我知道现实生活比这更丰富,但让我们保持简单) 我提出了以下模型: person\u has\u attribute\u value表中对

我正在尝试为以下场景设计一个数据库模型:

一个人可以有一系列描述他或她的“属性”,每个属性都有一些预定义的“值”可供选择。属性的一个示例可以是
'eyes'
,其可能值为
'hazel'
'blue'
'green'
。或者
'hair length'
'very long'
'long'
'medium'
'short'
'very short'
'none'
(是的,我知道现实生活比这更丰富,但让我们保持简单)

我提出了以下模型:

person\u has\u attribute\u value
表中对
person\u id,attribute\u id
对的唯一约束可确保每个人的给定属性不超过一个值。我还希望能够在不破坏数据完整性的情况下添加/删除/修改属性及其可能的值,因此所有关系在更新和删除时都具有
CASCADE

这应该可以很好地工作,但是:

1.假设对于某些属性,我希望能够为一个人分配多个值。是否有方法仅对
属性id
的某些值强制执行
人员id、属性id
的唯一性(最好基于
属性
表中的附加
多个布尔值
列),或者对于此类情况,我是否需要一组完全不同的表


2.假设某些属性没有预定义值,可以采用任意数值(例如:身高或体重)。有没有一种方法可以将这些属性合并到现有结构中,同时保留对那些具有预定义值的属性的约束,或者我需要另一组表来处理这种情况?

首先:我喜欢您的数据模型

关于第2点:如果需要,可以使用相同的数据模型。如果属性“高度[cm]”需要值182,则可以使用该值在属性值中创建记录并使用该值。但是,由于您希望使用另一种输入方法(键入值而不是从列表中选择值),因此需要在属性中设置一个标志来告诉您某个属性是固定列表属性还是自由变量属性

至于第1点:这更难,因为这违背了您的约束。乍一看,您有两个选择:

  • 放弃这个限制。那么,你可能会突然有一个人有两个不同的眼睛(哇,你甚至可以在你的数据库中存储David Bowie),或者有两个不同的高度,这可能是你不想要的。您必须相信您的程序和您自己在这方面要小心,因为dbms在这方面将不再帮助您
  • 为此使用新表
  • 但是,由于有三种类型的属性(单固定、多固定、单变量),我们可以将其作为主键引入数据库(主键粗体):

    • 属性类型(附件类型,说明)->单固定、多固定、单变量
    • attibute(附件类型,附件编号,描述)->眼睛=单固定,高度=单固定,国籍=多固定
    • 属性值(附件类型,附件编号,值,说明)->眼睛=单个附件固定=榛子
    • person有属性值(person\u id,att\u类型,att\u no,value)->Person1=眼睛=单眼睛=榛子色,Person1=国籍=多国籍=英国人,Person1=国籍=多国籍=德语
    根据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。也许您应该保持简单,只需坚持现有的,将属性类型添加到属性中,以确定输入方法并删除唯一约束。

    您想要做的类似于实现UML元模型的一小部分(包括对象及其属性值槽)以关系数据库模式的形式。我认为最简单的方法是将属性值表示为字符串,在多值属性的情况下,这些字符串可能是序列化的JSON数组。我建议首先创建一个UML类模型,然后将其转换为DB模型。[我不确定是否有时间为您做这件事。]