Mysql 关系数据库设计外键
我有表格Mysql 关系数据库设计外键,mysql,database-design,foreign-keys,modeling,Mysql,Database Design,Foreign Keys,Modeling,我有表格类型,其中有许多等级和许多颜色。 我在等级,类型_id中输入了外键,在颜色中输入了外键。 我有第三个名为item的表,它有等级和颜色 我的问题是,如何确保从项返回到类型的数据的完整性 例如: Type: 0 sometype1 1 sometype2 grades: 0 somegrade 0 (points to sometype1) color: 0 red 0 (points to sometype1) item: 0 ite
类型
,其中有许多等级
和许多颜色
。
我在等级
,类型_id
中输入了外键,在颜色
中输入了外键。
我有第三个名为item
的表,它有等级
和颜色
我的问题是,如何确保从项
返回到类型
的数据的完整性
例如:
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)
如何确保不会出现颜色
和等级
正确,但类型
不正确的情况
另外,如果一个外键引用了正确的类型,而另一个外键引用了不正确的类型,等等,该怎么办
在我看来,一定有更好的方法来建模,有人能帮忙吗?既然
颜色和等级参考类型
,你可以让项目
包含所有三个id值,并使用它们自己的id和类型id引用这两个表。由于外键约束将共享相同的类型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.
]
如果项目可以是某一类型,并且类型可以有一种或多种颜色和一种或多种等级,则项目表的FK引用不一定直接转到类型表。如果项目仅获取其特定类型的颜色和等级,则它不会直接引用颜色或等级
create table Colors(
ID int primary key,
<ColorInfo>
);
create table Grades(
ID int primary key,
<GradeInfo>
);
这里表示了颜色和a级类型的每个有效组合。因此,Items表只能引用具有定义的等级和颜色的类型
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 )
);
外键不是指向类型表,而是指向类型/颜色/等级组合。任何使用未为该类型定义的颜色或等级插入特定类型项目的尝试都将失败。因此等级
、颜色
和类型
将有一个外键指向项目
?如果等级
的外键是类型0,而颜色是类型1,则项可以是任何。。。我不确定这个hepsNo,为了清楚起见现在正在更新。您将如何实现项
外键约束?似乎一个外键只能引用一个表(这很有意义)。类似于CONSTRAINT
fk`外键(type\u id
,grade\u id
)引用grade
(type\u id
,id
)`???@avrono是的,像这样,您将有一个类似的第二个外键约束来引用颜色。由于这两个约束将共享相同的type_id,这将阻止您使用不同的类型引用颜色和等级。请提供更多关于类型、等级和颜色之间关系的信息,并提供更多的示例数据(为每个表多生成两行),以便我们能够理解您的请求。谢谢@TommCatt,我已经用第一个解决方案测试了我的模型,现在似乎还可以。然而,创建一个交集
表似乎也是一个可行的选择。在MySQL中,约束FK_Item_Type外键(TypeID、ColorID、GradeID)引用TypeColorGrade(TypeID、ColorID、GradeID)失败,引用不匹配,有什么想法吗?这是因为无法将子级中的一列映射到父级中的多列吗?我在示例中使用了整数数据类型作为默认值。你的可能不一样。检查数据类型是否匹配。我想我试图将单个id映射到多个fk(id)ref表(x,y,z),这显然是不允许的
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 )
);