【问题标题】:friendship database schema [closed]友谊数据库模式[关闭]
【发布时间】:2011-02-24 00:08:11
【问题描述】:

我正在创建一个涉及可以成为朋友的用户的数据库模式,我想知道为这些用户建立友谊的能力建模的最佳方法是什么。它应该是它自己的表,它只有两列,每列代表一个用户吗?谢谢!

【问题讨论】:

标签: mysql database database-design


【解决方案1】:

是的(使用 n:m 链接表)。

你有两个实体:

  • 用户(用于 ID、姓名、电子邮件等用户数据)
  • 关系(按 ID 链接两个用户)

每人创建一张表。

【讨论】:

    【解决方案2】:
    create table 
    friendship(
    user bigint, 
    friend bigint,
    primary key(user, friend),
    key(friend, user),
    constraint `fk_user` foreign key (user) references user(id),
    constraint `fk_friend` foreign key (friend) references user(id)
    );
    

    当用户1向用户2发送好友请求时,做

    insert into friendship (user, friend) values (1,2);
    

    如果用户 2 拒绝请求,

    delete from friendship where user = 1 and friend = 2;
    

    如果用户 2 接受:

    insert into friendship (user, friend) values (2,1);
    

    那么,这样就可以找到友谊了:

    select f1.* 
    from friendship f1
    inner join friendship f2 on f1.user = f2.friend and f1.friend = f2.user;
    

    你可以用最后一个查询来做一个视图,它会帮助你查询用户的朋友,甚至是朋友的朋友。

    【讨论】:

    • +1 以获得这个直接而详细的答案。但是,我尝试平衡每一行与两行友谊的利弊。你能解释一下为什么你认为两行更好吗?
    • 好问题。我在遗留应用程序中使用上述结构,但如果我要实现一个,我会尝试使用单行结构。如果您有 userfriendstatus 列用于友谊(其中状态可能意味着待处理、接受、拒绝或删除),查询待处理请求会容易得多(您需要两行左连接)。但是,查询用户的朋友会比较困难:select case when user=@userId then friend else user end as friendId from friendship where (user=@userId or friend=@userId) and status = 1;
    • 首先感谢 ceteras 的详细解释。关于主题:我会尝试混合使用这两种方法。我会使用 2 行方法,但为方便起见,我将添加第 3 行,它将标记已批准或待处理的请求,当我插入确认时,我将更新第一行以及标记已批准。
    • 为什么要同时添加主列和键列?
    • key(friend, user) 最初是 key(friend),但后来我将其设为覆盖索引,因此可以直接从索引中检索 id,而无需读取表。主键不包括按好友列查询。
    【解决方案3】:

    我不确定,这是我想要为整个设置建模的方式。当用户 A 向用户 B 发送请求时,我认为会创建 pending_friendship。 当用户 B 接受这个请求时,两人之间的友谊就建立了。通常这将是一种双向关系,并且会很棒。但我想确保将来存在单向关系的空间。因此,我将通过使用两个表作为关系表和一个表作为用户自己来模拟场景。

    用户( 用户身份, 电子邮件, 密码哈希, 姓名, ..., ... )

    待定_友谊( user_id_from, user_id_to )

    友谊( 友谊ID, current_user_id, 朋友用户ID, is_following boolean # 这将确保单向关系的范围。 )

    现在让我们看看用例-

    1- 用户 A 向用户 B 发送请求- 我将在 pending_friendship 表中创建一个条目。 当用户 B 想查看哪些好友请求未决时,我们可以根据friend_request_to 列进行选择查询。

    2- 用户 B 接受好友请求-pending_friendship 项目从表中删除。在双边关系的友谊表中创建了两个条目。两个用户都会互相关注。

    3- 用户 B 是好友,不想关注用户 A 的动态- 用户 B 与用户 A 的好友行的 is_following 列设置为 false。

    4- 用户 A 不想再和 B 做朋友了-(毕竟在案例 3 中 B 已经取消关注他 :-))我们继续删除两行以表示用户之间的友谊两个用户。

    此架构确实更复杂,但更清晰。它还允许您具有关注用户的关系。

    【讨论】:

    • 单表即可实现
    • 是的。我后来意识到了这一点。一张桌子也足够了。我认为单表具有易于架构的优点,并且具有清晰的优点。我想这将取决于设计师*他做出的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多