让我们说我有两张桌子。表1列出了具有唯一ID(auto_increment)的供应商。表2列出了这些供应商可能销售的场地或市场,也有唯一的ID。我希望能够快速访问供应商是否在某个特定市场。将有大量的供应商和场地。许多应用程序需要访问此信息并针对不同目的对其进行操作。我正在考虑两种方法。
方法1:
创建一个新表,其中包含与供应商相对应的行和列到地点的列。供应商场地栏中的“1”表示供应商位于该场所。这意味着在添加供应商时,我还在第三个表中创建了一个新列。我可能有很多供应商。
方法2:
在供应商表格中创建一个名为场所的列,在场地表中创建一个名为供应商的列。使用分隔的供应商或场地ID列表填充列。这似乎可能更难访问,但不需要具有可能令人难以置信的列数的新表。
实现每个的代码很简单,所以不会在这里发布。我的问题更多的是“最佳实践”或效率问题。谢谢。
答案 0 :(得分:4)
这是多对多关系,因此您应该使用交叉引用表。该表有两列 - vendor_id和venue_id,两列都有一个主键。
答案 1 :(得分:2)
都不是。
有第三个表,有两列,两个外键:供应商和场地。
这是standard approach并且效率很高(至少如果您正确设置了索引)。不要担心有大量的小行。 (然后必须提取数据,拆分数据,然后进行新查询,效率更高。)
答案 2 :(得分:1)
方法3:
创建一个包含两列的中间(也称为联结)表:vendor_id
和venue_id
以及主键(vendor_id, venue_id)
。第一列是FOREIGN KEY
到vendor (vendor_id)
,第二列是另一个FK到venue (venue_id)
。
如果您想要存储其他数据,也可以添加更多列,例如供应商开始销售特定场所,联系人(该场所的供应商等)
答案 3 :(得分:1)
如果供应商可以出现在多个地点,该怎么办?如果您想查看过去/未来某个特定地点的供应商,该怎么办?
使用第三个表(场所ID,供应商ID,其他列)来分解N:M关系。不要试图在一个列中存储多个场所或多个供应商。尽量不要使用布尔值 - 通常它们没有意义 - 因为你的问题是关于mysql至少使用枚举类型。