想象一下,你生活在非常简单的例子土地 - 和想象你已经有了一个人在一个表你的MySQL数据库:得到了一桌子的人,我要链接到对方是谁,许多一对多,与链接是双向
create table person (
person_id int,
name text
)
select * from person;
+-------------------------------+
| person_id | name |
+-------------------------------+
| 1 | Alice |
| 2 | Bob |
| 3 | Carol |
+-------------------------------+
而这些人需要协作/协同工作,让你有哪个环节一人记录到其他的链接表:
create table person__person (
person__person_id int,
person_id int,
other_person_id int
)
这样的设置意味着之间的联系人们是单向的 - 即爱丽丝可以链接到鲍勃,而鲍勃连接到爱丽丝,甚至w ORSE,爱丽丝可以链接到鲍勃和 Bob可以同时链接到爱丽丝,在两个单独的链接记录。由于这些链接代表了工作关系,在现实世界中,它们都是双向的相互关系。在这个设置中,以下是所有可能的:
select * from person__person;
+---------------------+-----------+--------------------+
| person__person_id | person_id | other_person_id |
+---------------------+-----------+--------------------+
| 1 | 1 | 2 |
| 2 | 2 | 1 |
| 3 | 2 | 2 |
| 4 | 3 | 1 |
+---------------------+-----------+--------------------+
例如,person__person_id = 4的上方,当您查看Carol的(为person_id = 3)简档,应该看到与Alice的关系(为person_id = 1),并且当您查看Alice的个人资料,即使链接以其他方式进行,您也应该看到与Carol的关系。
我知道我可以做工会和不同的查询和诸如此类的东西呈现在用户界面相互之间的关系,但有没有更好的办法?我有一种感觉,有是一个更好的办法,一个地方这个问题会整齐地融化掉通过适当设置数据库,但我不能看到它。任何人有更好的主意?
这是我从<50代表用户见过的格式最好的问题!干杯! – 2010-05-21 05:46:32
我将标记从'mysql many-to-many'更改为'data-modeling many-to-many'(+1 nice question!) – lexu 2010-05-21 06:07:49
+1陈述得很好的问题。 nit-pick:person__person是一个可怕的表名;只是声称它是用于照明目的;) – msw 2010-05-21 06:25:59