当前位置: 首页 > 面试题库 >

SQL-友谊表的最佳做法

任昊阳
2023-03-14
问题内容

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

在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吗?如果是这样,您能解释为什么吗?


问题答案:

使该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)


 类似资料:
  • 问题内容: 当前,正在讨论具有单个sql连接体系结构的优缺点。 为了详细说明我们正在讨论的是,在应用程序创建时打开一个sql连接,在应用程序关闭或错误关闭该sql连接时。根本不创建另一个连接,而只使用那个与数据库进行通信。 我们想知道社区的想法。 问题答案: 一旦您在不确定的时间内不再需要连接,请立即将其关闭。这样,连接将返回到连接池(如果启用了连接池),并且可以被其他人(重新使用)。 (连接是昂

  • 本文向大家介绍C++ 友谊,包括了C++ 友谊的使用技巧和注意事项,需要的朋友参考一下 示例 该friend关键字是用来给其他类和函数访问类的private和protected成员,甚至通过他们的class`s范围之外定义。            

  • 问题内容: 我正在编写一个友谊系统,它有两个表。 成员 ID 用户名 密码 朋友们 ID 用户身份 friend_id 状态 假设我想要一个可以选择成员$ userId的朋友ID的查询,如何在一个查询中做到这一点? 我找到了一个解决方案,可以进行2次查询。拳头选择朋友在哪里,第二个选择朋友在哪里,然后将它们混合成一个数组。如果没有其他解决方案,我将使用它。 请对SQL结构和查询有任何想法吗? 问题

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2个月前关闭。 每次设置新的SQL表或向现有表添加新列时,我都想知道一件事:的最佳价值是什么。 假设您有一个名为type 的列。因此,您必须选择长度。我想不出一个名称> 20个字符,但您永远不会知道。但是我总是使用四舍五入到下一个2 ^ n数字,而不是使用20。

  • 问题内容: 我正在创建一个涉及可以成为朋友的用户的数据库模式,我想知道建模这些朋友建立友谊能力的最佳方法是什么。难道是它自己的表仅具有两列,每个列代表一个用户?谢谢! 问题答案: 当用户1向用户2发送友谊请求时, 如果用户2拒绝该请求, 如果用户2接受: 然后,可以通过这种方式找到友谊: 您可以使用最后一个查询进行查看,这将帮助您查询用户的朋友,甚至朋友的朋友。

  • 问题内容: 多线程Java应用程序中进行进程间通信的最佳方法是什么? 它应该是高性能的(因此请不要使用JMS),易于实现且可靠,以便对象和数据只能绑定到一个线程? 任何想法欢迎! 问题答案: 假设场景1是JVM,那么实际上应该是多个线程,尤其是各种Queue实现,都是java.util.concurrent。但是,在此之上的抽象可能很好,Jetlang看起来非常有趣,轻量级的Java消息传递。