我目前正在设计“ 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”关系的首选方法是什么?
答案 0 :(得分:1)
这个问题与this one非常相似。答案基本相同:不,您不能有多个指向同一列的外键。正如该问题的回答者古法(Guffa)所说:“您如何知道在哪里寻找钥匙?”
您可以使用建议的解决方案来完成此操作,但是,正如您指出的那样,这并不理想。完全没有规范化。
问题是子类型有多个表。真正的答案是拥有您当前没有的“项目”表,并添加“类型”字段。
Items {ItemID(pk),ItemName,ItemType}
这样,您可以将ItemID用作您首先要使用的外键。但是,您选择执行此操作取决于您的需求/目标等,但是您不能将多个表作为外键链接到同一列。这样做有一个模棱两可的问题,即数据库无法解决。