我试图找出一种在MySQL数据库中实现两个表Lists(ListID, ListName)
和Items(ItemID, ItemName, Cost, Description, QuantityNeeded, QuantityPurchased)
之间的以下关系的有效且高效的方法:
列表可以有很多项。但是,
Description
表中的QuantityNeeded
,QuantityPurchased
和Items
属性特定于列表。例如,假设一个项目具有属性1, Paper Towels, 5.99, NULL, 4, 2
,另一个项目具有2, Paper Towels, 5.99, NULL, 7, 0
。尽管它们具有相同的ItemName
和Cost
,但它们来自不同的列表。
我可以采用哪种方式实现这一目标?我考虑过向ListID
表中添加一个属性Items
,以便每个项目“知道”它所属的列表,但这可能导致执行非常冗长的WHERE
(正确) ?),我希望它尽可能高效。
答案 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
如果你不知道简单型号的选项,你就不用担心“效率”了。你需要更多的设计(包括约束)和查询经验。您的情况几乎可以通过订单和信息建模来解决。订单(行)项目而不是列表&项目