Mysql 多对多关系

Mysql 多对多关系,mysql,database,Mysql,Database,如果我有两个表-table beer和table distributor,每个表都有一个主键,第三个表有外键并调用beer\u distributor 此表中的新字段(主键)是否足够?另一种方法是连接,对吗?例如,要获得DUVEL De Vrolijke drinker?您肯定有正确的想法。您的beer\u分销商表就是我们所知的一张表。联接和键/索引一起使用。数据库系统使用键使连接快速高效地工作。您可以通过将beer和distributor两个表连接到该连接表来使用该连接表 并且,您的连接表应

如果我有两个表-
table beer
table distributor
,每个表都有一个主键,第三个表有外键并调用beer\u distributor


此表中的新字段(主键)是否足够?另一种方法是连接,对吗?例如,要获得DUVEL De Vrolijke drinker?

您肯定有正确的想法。您的
beer\u分销商
表就是我们所知的一张表。联接和键/索引一起使用。数据库系统使用键使连接快速高效地工作。您可以通过将
beer
distributor
两个表连接到该连接表来使用该连接表


并且,您的连接表应该有一个横跨两列的主键(多列索引/“复合索引”),如果我正确理解该图,它看起来就是这样。那样的话,我觉得不错。做得很好。

我会在连接表
中放入主键,而不是两个外键中的双主键。在我看来,维持这种关系会让生活更轻松

更新

为了强调这一点,考虑更改分销商<代码> ACOO9<代码>啤酒>代码> 163 < /代码>。使用双主键时,必须先删除,然后重新插入,或者知道两个现有值才能更新记录。使用单独的主键,只需使用此值更新记录。在这些数据上构建应用程序时非常方便。如果严格来说这是一个数据仓库,那么从DBA的角度来看,双主键可能更有意义

UPDATE beer_distributor SET distributor_id = XXXXX WHERE beer_id = 163 AND distributor_id = AC009

UPDATE beer_distributor SET distributor_id = XXXXX WHERE id = 1234

+1对于Brugse Trippel-希望我能在这里找到它。不确定您的标准是什么,但我们倾向于在beer_distributor表名称中添加“_rel”,以表明它只是一个关系表,详细说明了其他两个表之间的链接。不鼓励人们尝试将信息放在其中,而这些信息可能更适合放在另外两个表中的一个表中。不要说其他信息不应该存在于此,例如,如果您有一个以上的啤酒经销商,价格可能会有所不同,并且此值可以存在于rel表中。@MadMurf感谢您的建议:)@MadMurf+1用于命名约定。就我个人而言,我已如上所述命名了连接表,用下划线分隔相关的表名。只有连接表才会有下划线,因为任何“多字”表名都是大小写。重要的是您选择一个并始终坚持它。我更喜欢你的方式,但这个决定是在70年代做出的。:-)我认为在连接表中进行更新是没有意义的。要么关系存在,要么不存在。如果它改变了,那是一个不同的关系,因此删除该关系并添加新关系。如果您谈论的是分销商的
distributor\u id
是否更改,只需
UPDATE
其中
distributor\u id
就是您要寻找的值。旁注:如果您的记录ID可能会更改,那么当您必须在整个系统中更新时,您只是在自找麻烦。不要这样做。:-)简而言之,我个人不想像你建议的那样,只为主键添加第三列。@Jason McCreary好的,谢谢,我明白了。然而,我仍然认为这将构成一种完全不同的关系。另外,一个新的主键在这里也没有用。我认为您永远不会在任何地方使用主键的id,因此您仍然需要检查两列中要替换的值。这就是编程的美妙之处,也是编程的祸根——有多种方法可以做到这一点。@类似的问题: