数据库计划 – 挚友列表:相关数据库表计划
以是,挚友列表的当代观念:
buddyID person1_id person2_id 0 1 2 1 3 6 可是,当用户想要查察他们的挚友列表时,该措施必需搜查列’person1_id’和’person2_id’以找到他们全部的挚友. 这是实现这种表的恰当方法,照旧两次添加记录更好..即 buddyID person1_id person2_id 0 1 2 1 2 1 因此只必要搜刮一列. 提前叩谢. 办理要领这是一个多对多的相关,这必要一个副黄?.create table Person ( person_id int not null primary key,username varchar(100) not null,... other_cols ... ) create table Buddy ( person_id1 int not null,person_id2 int not null,primary key (person_id1,person_id2),foreign key (person_id1) reference Person (person_id),foreign key (person_id2) reference Person (person_id) ) 以是Person表显然会为每个Person包括1行.它将包括关于搭档的任何数据,由于它会使其非类型化.相反,Buddy表将包括职员之间的相关. 以是假设你在Person表中有这样的对象: person_id username 1 George 2 Henry 3 Jody 4 Cara 亨利和卡拉是好伴侣,乔治和卡拉也是云云: person_id1 person_id2 2 4 1 4 假如您必要使相关不是隐式彼此关联,那么您将必要添加其他行以使其明晰.以是此刻让我们说亨利以为卡拉是个搭档而卡拉同样以为亨利是个搭档,而乔治以为卡拉是个搭档,但卡拉不会回应乔治: person_id1 person_id2 2 4 4 2 1 4 失落的4 1表白卡拉并不以为乔治是个挚友.这样可以保持很是干净并停止数据非常.您可以调解相关,而无需行使Person数据.您还可以在外键上界说删除级联法则,以便删除Person会自动删除全部关联的相关.相反,您也许但愿防备相反,在这种环境下,您可以在外键上指定restrict(默认值),以防备删除仍界说相关的Person. 查询也很轻易: Cara有几多搭档(让我们假设挚友列表的相关是隐含的): select count(*) from Person join Buddy on person_id = person_id1 or person_id = person_id2 where name = 'Cara' 对付不体现相关的环境,最好重定名列,如下所示: person_id considers_as_buddy_id 2 4 4 2 1 4 4 3 select count(*) from Person P join Buddy B on P.person_id = B.person_id where name = 'Cara' 这将返回Cara以为是挚友的人数.在这种环境下2.固然Jody并不以为Cara是一个挚友 – 以是要找出彼此相关,你会这样做: select count(*) from Person P join Buddy B on P.person_id = B.person_id and B.considers_as_buddy_id = P.person_id where name = 'Cara' (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |