Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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创建表之间的结构关系_Mysql_Database Design_Relational Database - Fatal编程技术网

MySQL创建表之间的结构关系

MySQL创建表之间的结构关系,mysql,database-design,relational-database,Mysql,Database Design,Relational Database,我有两个表,一个表包含项目及其属性,它们是整数: 项目表: item_id, property_a, property_b, property_c property_a, property_b, property_c 以及另一个单行表,其中包含这些属性的允许偏差, 还有整数: 允许偏差表: item_id, property_a, property_b, property_c property_a, property_b, property_c 这是可行的,但两个表之间没有正式的关系,因

我有两个表,一个表包含项目及其属性,它们是整数:

项目表:

item_id, property_a, property_b, property_c
property_a, property_b, property_c
以及另一个单行表,其中包含这些属性的允许偏差, 还有整数:

允许偏差表:

item_id, property_a, property_b, property_c
property_a, property_b, property_c
这是可行的,但两个表之间没有正式的关系,因此无法确保在以任何方式修改items表时它们是同步的(除了手动或在应用程序级别处理它)

所以我的问题是-对于这种情况,什么是最佳实践?这两个表的结构之间是否可以也应该在数据库级别上建立某种关系,还是应该保持良好的状态

我的一个想法是,由于偏差是一个单行表,只需将其放在items表中,为其指定特定的虚拟项,但我看到的问题是:

--虚拟数据,不喜欢在我迄今为止干净的数据库中 --使仅与项目相关的查询复杂化 --在一张桌子上混合苹果和桔子
--如果需要多组允许偏差,则很难进行扩展

我认为您需要在这里进行一点归一化

您可以采用以下方法:

项目表

id  item
1   item1
id  item_id, property_id
1     1         1
2     1         2
3     1         3
property_id, property_type
1               a
2               b
3               c
项目属性表

id  item
1   item1
id  item_id, property_id
1     1         1
2     1         2
3     1         3
property_id, property_type
1               a
2               b
3               c
允许偏差表

id  item
1   item1
id  item_id, property_id
1     1         1
2     1         2
3     1         3
property_id, property_type
1               a
2               b
3               c
这将允许您在引用允许偏差表和项目表本身的项目_属性表上设置FK约束。它还应该允许没有所有属性(没有空数据)的项,并且还应该允许您在出现任何新属性时添加新属性(例如属性d)

希望这有帮助


PS当你说“我的一个想法是,因为偏差是一个单列表”时,你的意思是“我的一个想法是,因为偏差是一个单行表”

谢谢,是的,我指的是行,问题已编辑。我不太确定我是否完全得到了你的答案——偏差表将属性定义保存为行,这是建议吗?如果是这样的话,它的缺点是如果需要另一组偏差,这将需要一个新的列,这可能不是组织数据的最佳实践。是的。其思想是将属性定义保留为行。我的想法是,如果存在另一组允许的偏差(例如d、e和f),这意味着将在偏差表和item_属性表中插入3个新行,以填充新偏差组适用的项目。它不需要添加新列。希望这有意义!