admin

SQL-友谊表的最佳做法

sql

在向我显示重复项之前,请注意,我已经在网站上进行搜索,发现了 一些 示例,但并非完全针对我的问题:)

在SQL中创建 友谊 表的最佳方法是什么,但是要确保每行都是唯一的,因为无论它们属于哪一列,相同的UserID和FriendID都不会被允许?

我有这个粗略的例子

CREATE TABLE [dbo].[Friendship](
    [UserID] [uniqueidentifier] NOT NULL,
    [FriendID] [uniqueidentifier] NOT NULL,
    [FriendshipStatus] [int] NOT NULL
)

并有2个外键,分别来自UserID和FriendID。

不过目前,我可以在用户之间插入 两次 Friendship ,从而创建一个副本。例子

UserID    FriendID    FriendshipStatus
Guid 123   Guid 789    1
Guid 789   Guid 123    1

我如何确保强制执行此完整性,也许是 2个PK ?某种 独特的索引
?还是您会建议一个更好的餐桌设计?另外,您会自动增加FriendshipID吗?如果是这样,您能解释为什么吗?


阅读 159

收藏
2021-05-10

共1个答案

admin

使该FRIENDSHIP表的主键为:

  • 用户身份
  • 友情

…将确保您不能有重复的订单。意思是,它将阻止您添加用户标识“ 123”和友好标识“
789”的重复项。如果包含状态列,则不再是这种情况,因为不同的状态值将允许userid和friendid列的重复。

停止反向对

为了停止反向对-用户标识“ 789”和友好标识“
123”,您需要包含逻辑以检查该对在存储过程,函数或触发器中是否已存在于表中。如果还不存在相反的条件,则userid
<friendid的CHECK约束将停止添加userid“ 789”和friendid“ 123”的有效尝试。

INSERT INTO FRIENDSHIP
SELECT @userid, @friendid, 1
  FROM FRIENDSHIP f
 WHERE NOT EXISTS(SELECT NULL
                    FROM FRIENDSHIP t
                   WHERE (t.userid = @friendid AND t.friendid = @userid)
                      OR (t.userid = @userid AND t.friendid = @friendid)
2021-05-10