涉及多个子类项目的关系

时间:2018-10-28 01:20:32

标签: mysql sql database-design mysql-workbench database-schema

我目前正在设计“ Bar Beer Drinkers”数据库的扩展(通常用于教授基本的SQL查询)。

作为设计的一部分,我创建了遵循“ ISA”模式的实体,特别是: “啤酒”,“食物”和“ OtherItems”都是“ Item”的“子类”。

涉及的另一个实体是Bars实体。

在条和项之间,我有一个称为“出售”的关系实体。

这些表的架构如下:

Bar[ID(pk), Name, State, Address, Phone, Open, Close]
Beers[Name(pk), Manf]
Food[Name(pk), Manf]
OtherItems[Name(pk), Manf].

按现状,我没有一个名为“ Items”的表。

对于Sells表,架构为:

Sells[barID(fk), item(fk), price]

我希望将所有三个表中的PK映射到销售中的“项目”列中。我也可以在其中输入啤酒名称,食物名称或其他商品名称。

这在MySQLWorkBench中似乎不起作用,因为它不允许我将多个外键引用到同一列。

我可能解决此问题的方法是:

Sells[barID{fk), beerItem(fk), foodItem(fk), otherItem(fk), price]

但是,这将导致每个元组至少具有两个空值。这可以接受吗?在SQL的关系实体中包括“ ISA”关系的首选方法是什么?

1 个答案:

答案 0 :(得分:1)

这个问题与this one非常相似。答案基本相同:不,您不能有多个指向同一列的外键。正如该问题的回答者古法(Guffa)所说:“您如何知道在哪里寻找钥匙?”

您可以使用建议的解决方案来完成此操作,但是,正如您指出的那样,这并不理想。完全没有规范化。

问题是子类型有多个表。真正的答案是拥有您当前没有的“项目”表,并添加“类型”字段。

Items {ItemID(pk),ItemName,ItemType}

这样,您可以将ItemID用作您首先要使用的外键。但是,您选择执行此操作取决于您的需求/目标等,但是您不能将多个表作为外键链接到同一列。这样做有一个模棱两可的问题,即数据库无法解决。