多对多数据库设计,第三表?

时间:2013-08-02 00:05:52

标签: mysql sql

我是MySQL的初学者,到目前为止,我只需要使用“多对一”表链接。我现在需要一个“多对多”链接,但我不确定如何做到这一点。据我所知,我需要第三张表。

基本上我有一张满是公园的桌子和一张桌子上的文章链接。在显示单个公园详细信息的网页上,我需要查询查找该公园的任何附件。通常我会在另一个表中使用park_id列并使用它来链接,但这里的问题是每篇文章都可以链接到许多公园。

示例查询将是:

SELECT * FROM tpf_features  
Where park_id = 7

但是一篇文章的park_id可能是3,7,13,23。

有人能指出我正确的方向来建立这种关系并正确查询。

谢谢

2 个答案:

答案 0 :(得分:7)

你应该使用第三个表并关联他们的id' s: (仅使用id' s创建表格)

Create table parks( 
   park_id integer,
   primary key (park_id)
);

Create table articles(
   article_id integer,
   primary key (article_id)
);

CREATE TABLE cross_table(
   article_id integer,
   park_id    integer,
   Primary Key (article_id,park_id), 
   Foreign Key (article_id) REFERENCES articles(article_id),
   Foreign Key (park_id) REFERENCES parks(park_id)
);

然后,当您想要找到与公园相关的文章的相关信息时,您可以这样做:

SELECT a.* 
FROM cross_table c, articles a
WHERE c.article_id = a.article_id
AND c.park_id = 7;

这将返回与park_id = 7相关的所有文章的所有信息。

主键,确保每篇文章都有唯一的ID,每个公园都有唯一的ID,并且它们只在cross_table中关联一次。

答案 1 :(得分:3)

实际上,您需要第三个“链接”表,该表应该只包含两列:一个是park id,另一个是item ID。虽然这些ID可能是各自原始表中唯一的主键,但它们在链接表中不一定是唯一的。

第三个链接表允许每个原始表中出现多次ID,而不会与这些原始表中的唯一性冲突。虽然每个单独的id很多次出现在链接表中,但park / article的每个组合只会出现一次。

然后,为了选择与park 7相关的所有文章,您只需要选择链接表中park_id = 7的所有行

SELECT * FROM linking_tbl
WHERE park_id = 7