[英]Efficient SQL Schema Design with Odd One-to-Many Relationship
我试图找出一种有效和高效的方法来实现MySQL数据库中两个表, Lists(ListID, ListName)
和Items(ItemID, ItemName, Cost, Description, QuantityNeeded, QuantityPurchased)
之间的以下关系:
列表可以包含许多项目。 但是,
Items
表中的Description
,QuantityNeeded
和QuantityPurchased
属性特定于列表。 例如,假设一个项目具有属性1, Paper Towels, 5.99, NULL, 4, 2
另一个是2, Paper Towels, 5.99, NULL, 7, 0
。 尽管它们具有相同的ItemName
和Cost
,但它们来自不同的列表。
实现这个目标的最佳方法是什么? 我曾考虑过将一个属性ListID
添加到Items
表中,以便每个项目“知道”它所属的列表,但是这可能会导致WHERE
执行非常冗长(正确吗?),并且我希望它的效率与可能。
应用程序关系不在表之间,它们是值(或如此标识的实体)之间,并由表表示。
加
-- 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
如果你不知道简单模型的选项,你就不用担心“效率”了。 您需要更多设计(包括约束)和查询体验。 您的情况几乎可以通过订单和订单(行)项目而非列表和项目来进行信息建模的任何介绍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.