如何使SQL多对多类型的关系表

Dan*_*eed 22 sql

我是SQL的新手,我正在首先尝试尽可能多地学习,因为我正在编码,这很难,因为我正在设计数据库,我将不得不忍受一段时间,所以我我想确保我做得对.我学习了多对多桥接表的基础知识,但是如果这两个字段是相同的类型呢?让我们说一个拥有数千名用户的社交网络,你会如何创建一个表来跟踪谁是谁的朋友?如果有关于每个关系的其他数据怎么办,比如说......"约会对象".知道会有"在dateY和dateZ之间显示所有userX朋友"之类的查询.我的数据库有几种这样的情况,我无法找到一种有效的方法.既然它对我来说很重要,我认为其他人已经找到了设计表格的最佳方法,对吧?

tot*_*dli 34

创建一个User表,然后创建一个表Relationships,您可以在其中存储id两个朋友的关系以及关于他们关系的任何类型的信息.

SQL图

SQL图

MySQL代码

CREATE TABLE `Users` (
  `id` TINYINT NOT NULL AUTO_INCREMENT DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `Relationships` (
  `id` TINYINT NOT NULL AUTO_INCREMENT DEFAULT NULL,
  `userid` TINYINT NULL DEFAULT NULL,
  `friendid` TINYINT NULL DEFAULT NULL,
  `friended` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
);

ALTER TABLE `Relationships` ADD FOREIGN KEY (userid) REFERENCES `Users` (`id`);
ALTER TABLE `Relationships` ADD FOREIGN KEY (friendid) REFERENCES `Users` (`id`);
Run Code Online (Sandbox Code Playgroud)

SQL选择

在使用数据填充表后,您可以创建SQL SELECT查询以获取所有朋友.你的朋友是那些id在你的身份在另一边而在一边的人.您检查双方,id这样您就不需要存储两次关系.此外,你必须排除你的id,因为你不能成为自己的朋友(在一个正常,健康的世界).

SELECT *
FROM Users u
   INNER JOIN Relationships r ON u.id = r.userid
   INNER JOIN Relationships r ON u.id = r.friendid
WHERE
   (r.userid = $myid OR r.friendid = $myid)
   AND r.friended >= $startdate
   AND r.friended <= $enddate
   AND u.id != $myid;
Run Code Online (Sandbox Code Playgroud)

其中$myid,$startdate$enddate可以是PHP变量,所以在双引号中,您可以将此代码直接传递给您的数据库.


Dai*_*Dai 4

单个链接表就足够了,如下所示:

People( PersonId bigint, Name nvarchar, etc )
Friends( FromPersonId bigint, ToPersonId bigint, DateAdded datetime )
Run Code Online (Sandbox Code Playgroud)

示例查询:

谁和我是朋友?(即加我为好友但不一定回复的人)

SELECT
    People.Name
FROM
    Friends
    INNER JOIN People ON Friends.FromPersonId = People.PersonId
WHERE
    Friends.ToPersonId = @myPersonId
Run Code Online (Sandbox Code Playgroud)

谁在两个日期之间添加了我?

SELECT
    People.Name
FROM
    Friends
    INNER JOIN People ON Friends.FromPersonId = People.PersonId
WHERE
    Friends.ToPersonId = @myPersonId
    AND
    Friends.DateAdded >= @startDate
    AND
    Friends.DateAdded <= @endDate
Run Code Online (Sandbox Code Playgroud)