关系数据库设计外键

时间:2015-05-13 17:18:09

标签: mysql database-design foreign-keys modeling

我的表格types有很多grades和许多colors。 我在[{1}},gradestype_id中添加了一个外键。 我有一个名为colors的第三个表,其中包含itemgrade

我的问题是,如何确保从color返回item的数据的完整性。

例如:

types

如果Type: 0 sometype1 1 sometype2 grades: 0 somegrade 0 (points to sometype1) color: 0 red 0 (points to sometype1) item: 0 item1 0 0 (points to somegrade, red - which points to sometype1) color正确但grade不正确,我如何确保不会出现这种情况?

另外如果其中一个外键引用了正确的类型而另一个没有引用等等呢?

在我看来,必须有更好的方法对此进行建模,任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分:1)

由于colorgrade引用types,您可以让item包含所有三个id值,并使用自己的ID和type_id引用这两个表。由于外键约束将共享相同的type_id,因此无法从不同类型引用等级和颜色。

表格中最小的列是:

types: type_id 
       [no foreign key constraints]
grades: grade_id, type_id 
       [type_id references types.type_id]
colors: color_id, type_id 
       [type_id references types.type_id]
items: item_id, type_id, grade_id, color_id
       [ (type_id, grade_id) should reference grades as one key
        ,(type_id, color_id) should reference colors as one key
        , type_id would reference types but that should not need enforced with a constraint.
       ] 

答案 1 :(得分:1)

如果Item可以是某个Type和Type可以有一个或多个Colors和一个或多个Grades,那么Items表的FK引用可能不一定直接转到Types表。如果项目仅获得其特定类型的颜色和等级,则不直接指代颜色或等级。

create table Colors(
    ID     int primary key,
    <ColorInfo>
);
create table Grades(
    ID     int primary key,
    <GradeInfo>
);

如果每种类型可以有多种颜色和等级组合,则必须将引用移动到交叉表。

create table TypeColorGrade(
    TypeID    int,
    ColorID   int,
    GradeID   int,
    constraint PK_TypeColorGrade primary key( TypeID, ColorID, GradeID ),
    constraint FK_TypeColorGrade_Type foreign key( TypeID )
        references Types( ID ),
    constraint FK_TypeColorGrade_Color foreign key( ColorID )
        references Colors( ID ),
    constraint FK_TypeColorGrade_Grade foreign key( GradeID )
        references Grades( ID )
);

此处表示类型可以具有的每种颜色和等级的有效组合。因此,Items表只能引用具有定义的等级和颜色的Type。

create table Items(
    ID       int,
    TypeID   int,
    ColorID   int,
    GradeID   int,
    constraint PK_Items primary key( ID ),
    constraint FK_Item_Type foreign key( TypeID, ColorID, GradeID )
        references TypeColorGrade( TypeID, ColorID, GradeID )
);

外键不是指向Types表,而是指向Type / Color / Grade组合。任何尝试插入具有未为该类型定义的颜色或等级的特定类型的项目都将失败。

相关问题