【发布时间】:2017-01-27 14:30:36
【问题描述】:
我正在尝试找出一种有效且高效的方法来在 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 执行(正确?),我想要这要尽可能高效。
【问题讨论】:
-
规则 1:不存在一对多的关系。客户会告诉你它是,然后 6 个月后改变主意。为架构中的每个关系使用连接表。它将支持 1 对多、多对多或多对 1,您可以标准化处理在代码中建立关系的方式,当客户发现“哎呀,我们错了,这是多对多”时,您就遥遥领先其中。这听起来像是更多的工作,但是一旦你编写了“在这两个表中的这两个记录之间建立关系”函数,你就完成了,所以它实际上更容易。
-
@ChrisCaviness 所以你说我需要另一张桌子。这是否与
ItemsLists(ItemID, ListID)类似,两者构成关键?但这会遇到同样的问题吗?比如说,我想提取给定列表中的所有项目。难道我不必使用WHERE子句在所有元组中搜索具有给定ListID的所有内容吗?如果是这样,效率如何? -
您将使用连接表作为主要来源... SELECT b.* FROM ItemsLists a JOIN items b ON a.ItemID = b.ItemID WHERE a.ListID = 12345 至于效率,高度高效,因为您的连接表行长度很小,并且列被索引。您最终会从连接表中获得所需的 Item 索引值的一小部分,然后由连接使用。
标签: mysql database-schema