繁体   English   中英

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

[英]Efficient SQL Schema Design with Odd One-to-Many Relationship

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

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

实现这个目标的最佳方法是什么? 我曾考虑过将一个属性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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM