具有奇怪的一对多关系的高效SQL模式设计

时间:2017-01-27 14:30:37

标签: mysql database-schema

我试图找出一种在MySQL数据库中实现两个表Lists(ListID, ListName)Items(ItemID, ItemName, Cost, Description, QuantityNeeded, QuantityPurchased)之间的以下关系的有效且高效的方法:

  

列表可以有很多项。但是,Description表中的QuantityNeededQuantityPurchasedItems属性特定于列表。例如,假设一个项目具有属性1, Paper Towels, 5.99, NULL, 4, 2,另一个项目具有2, Paper Towels, 5.99, NULL, 7, 0。尽管它们具有相同的ItemNameCost,但它们来自不同的列表。

我可以采用哪种方式实现这一目标?我考虑过向ListID表中添加一个属性Items,以便每个项目“知道”它所属的列表,但这可能导致执行非常冗长的WHERE(正确) ?),我希望它尽可能高效。

1 个答案:

答案 0 :(得分:0)

应用程序关系不在表之间,它们是值(或如此标识的实体)之间,并由表格表示。

添加

-- list ListID has member ItemId
-- UNIQUE/PK (itemID)
-- FK (listID) references Lists
-- FK (itemID) references Items
Member(ListID, itemID)

或者用

替换项目
-- list ListID has member ItemId and item ItemId ...
-- UNIQUE/PK (ItemID)
-- FK (ListID) referencing Lists
ItemsX(ListID, ItemID, ItemName, Cost, Description, QuantityNeeded, QuantityPurchased)

前者很难在SQL中约束,也有相当于引用Member的FK Items(ItemID),即每个项必须是某个列表的成员。所以通常会使用后者。

请注意

ItemsX = ListID, i.* from Member m join Items i on m.ItemID = i.ItemId
Items = select ItemID,... from ItemsX
Member = select ListID, ItemID from ItemsX

如果你不知道简单型号的选项,你就不用担心“效率”了。你需要更多的设计(包括约束)和查询经验。您的情况几乎可以通过订单和信息建模来解决。订单(行)项目而不是列表&项目