Php Mysql-处理供应商/场馆对表的最有效方法

Php Mysql-处理供应商/场馆对表的最有效方法,php,mysql,Php,Mysql,假设我有两张桌子。表1是具有唯一ID(自动增量)的供应商列表。表2列出了这些供应商可能销售的场馆或市场,也有唯一的id。我希望能够快速访问供应商是否在特定市场。将有大量的供应商和场馆。许多应用程序需要访问这些信息,并出于不同的目的对其进行操作。我正在考虑两种方法 方法1: 创建一个新表,其中行对应于供应商,列对应于场馆。场馆栏中供应商的“1”表示供应商在该场馆。这意味着在添加供应商时,我还在第三个表中创建一个新列。我可能有很多供应商 方法2: 在“供应商”表中创建一个名为“场馆”的列,在“场馆”

假设我有两张桌子。表1是具有唯一ID(自动增量)的供应商列表。表2列出了这些供应商可能销售的场馆或市场,也有唯一的id。我希望能够快速访问供应商是否在特定市场。将有大量的供应商和场馆。许多应用程序需要访问这些信息,并出于不同的目的对其进行操作。我正在考虑两种方法

方法1:

创建一个新表,其中行对应于供应商,列对应于场馆。场馆栏中供应商的“1”表示供应商在该场馆。这意味着在添加供应商时,我还在第三个表中创建一个新列。我可能有很多供应商

方法2:

在“供应商”表中创建一个名为“场馆”的列,在“场馆”表中创建一个名为“供应商”的列。使用供应商或场馆ID的分隔列表填充列。这似乎更难访问,但不需要一个列数可能非常多的新表

实现每种方法的代码都很简单,因此不会在这里发布。我的问题更多的是“最佳实践”或效率问题。多谢各位

都不是

第三个表有两列,都是外键:供应商和地点

这是最有效的方法(至少在索引设置正确的情况下)。不要担心有大量的小行。(与提取数据、拆分数据然后进行新查询相比,效率要高得多)。

两者都不是

第三个表有两列,都是外键:供应商和地点


这是最有效的方法(至少在索引设置正确的情况下)。不要担心有大量的小行。(这比提取数据、拆分数据、然后进行新查询要高效得多)。

这是一种多对多关系,因此您应该使用交叉引用表。此表将有两列-供应商id和场馆id,两列之间都有主键。

这是一种多对多关系,因此您应该使用交叉引用表。此表有两列-供应商id和场馆id,两列之间都有一个主键。

方法3:

制作一个包含两列的中间(也称为连接)表:
vendor\u id
vention\u id
,主键为
(vendor\u id,vention\u id)
。第一列为
外键至
供应商(供应商id)
,第二列为另一个FK至
场馆(场馆id)

如果您想存储更多数据,也可以添加更多列,例如当供应商开始销售特定场地时,(该场地供应商的)联系人等。

方法3:

制作一个包含两列的中间(也称为连接)表:
vendor\u id
vention\u id
,主键为
(vendor\u id,vention\u id)
。第一列为
外键至
供应商(供应商id)
,第二列为另一个FK至
场馆(场馆id)


如果您想存储更多数据,也可以添加更多列,例如当供应商开始销售特定场馆时,联系人(该场馆供应商的联系人等)

如果供应商可以出现在多个场馆怎么办?如果您想了解过去/未来某个日期某个特定地点有哪些供应商,该怎么办


使用第三个表(场馆id、供应商id、其他列)分解N:M关系。不要试图在一列中存储多个场地或多个供应商。尽量不要使用布尔值-通常它们是没有意义的-因为你的问题是关于mysql的,至少要使用枚举类型。

如果一个供应商可以出现在多个地点怎么办?如果您想了解过去/未来某个日期某个特定地点有哪些供应商,该怎么办


使用第三个表(场馆id、供应商id、其他列)分解N:M关系。不要试图在一列中存储多个场地或多个供应商。尽量不要使用布尔值-通常它们是没有意义的-因为你的问题是关于mysql的,至少使用枚举类型。

方法1不是交叉引用表,它看起来像:供应商id、venue1(布尔)、venue2(布尔)、venue3(布尔)等等。是的,我几乎做了同样的事情。;)方法1不是交叉引用表,它看起来像:供应商id、venue1(bool)、venue2(bool)、venue3(bool)等等。是的,我几乎做了同样的事情我认为这里有一个普遍的共识,所以我将继续并选择一个正确的答案。谢谢大家的参与。我想大家已经达成了共识,所以我会选择一个正确的答案。谢谢大家的参与。