【问题标题】:Database schema to store friendship details用于存储友谊详细信息的数据库模式
【发布时间】:2012-12-11 12:45:22
【问题描述】:

我正在创建一个应用程序,其中用户使用她的 twitter/facebook/foursquare 帐户顺序登录,并获取她关注的人(或将他们作为朋友在她的列表中)的所有 ID 和其他详细信息

我已经提到了这些问题:

但唯一的问题是,上面的设计侧重于“友谊”模型,而我想将系统建立在“跟随”模型的基础上。
在“友谊”模型中,两个用户相互添加/确认,而在“关注”模型中,一个用户可以关注另一个用户,无需确认。

我可以继续设计,其中一个表存储我的应用程序的所有用户,另一个存储他们关注的所有人员以及其他信息,但由于我对数据库设计不是很好,所以我很担心关于我最终复制很多行的情况。
例如:

  • 如果 Kathy 在某个网络上关注 Ana,Steve 在其他网络上关注 Ana,我最终会得到两行 Ana,描述与这两个用户的关系。这样好吗?
  • 如果在不同的网络上,Ana 和 Steve 互相关注会怎样?这种关系有两行是否可以避免?
  • Steve 在某个网络上关注 Kathy,他们的关系将再次出现一行。这样可以吗?
  • Ana 很可能是 Kathy 在多个社交网络 (twitter+facebook) 上的朋友,我必须有两行来为同一个人 Ana 存储这两个网络的不同信息。这样好吗?

在数据库设计方面,我不是专业人士,通常是从数据库人员那里设计的,但这次是我的个人应用程序,所以我不太清楚什么是好的,什么不是。

这个系统可能会变得相当大,因为不同的用户最终会添加多个社交网络帐户。我将在开始时使用 LAMP,基本上我担心糟糕的数据库设计可能会增加复杂性。

欢迎对架构提出任何建议或想法。
如果需要更多信息,请发表评论。

谢谢!

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

    如果您希望对数据库进行规范化,则需要为每个关系单独设置一行。如果您存储了所有关系,假设将关注者 id 放在名为 followerID 的字段中,那么如果基于一个关注者删除该记录,则所有关注者都将被删除。所以是的,多条记录是个好主意。

    您还可以使用followed 和follower 的主键以及您需要的任何其他相关信息来设置一个基于Follow_Relationships 之类的关系表。这样,您只需对两个表执行连接即可。

    我希望这会有所帮助!

    【讨论】:

    • 这非常有帮助,虽然我将不得不再次烧烤我的连接知识:P
    【解决方案2】:

    由于社交网络的数量有限,将不同网络中的关系作为单个关系中的标志并不会太浪费。

    例如,如果 Steve 和 Ana 在任何网络中连接,则该关系可以在一行中表示,并带有附加列来表示不同的关注/朋友关系。如果您的用户数量有限,那么这可能是可以接受的,因为它易于使用并权衡设计效率。

    对于大型数据库,建议建立适当的关系,我会说您需要为与每个用户的每个关系创建不同的记录。如果您有两个用户互相关注的场景,我想您可以针对两个用户之间的单个记录设置一个“isReciprocal”标志:

    User1|User2|isReciprocal
    Steve|Kathy|1
    

    当 isReciprocal = 1 时,它们相互跟随,如果为 0,Steve 跟随 Kathy,但 Kathy 不跟随 Steve。

    如果关系发生变化(Steve 取消关注 Kathy,Kathy 开始关注 Steve),则可以更改该关系,以便 Kathy 是 User1,Steve 是 User2。希望这很清楚。

    虽然设计最终是一个规模问题。如果您的用户数少于 10000 并且不经常更新,那么一些非常低效的设计是完全可以的。如果您要处理数以万计的记录和关系,并且不断更新,那么使设计更高效是非常明智的。

    通常,一个小型且快速的解决方案可能会被过度设计,我认为在这些情况下,非标准化数据是可以接受的,因为您因此获得了易用性。

    【讨论】:

    • 我明白你的isReciprocal 概念。谢谢! 10,000 个用户是指总共 10000 条记录?如果您指的是 10k 用户,然后是他们不同的朋友,那么它将变得非常庞大。但是,是的,我不应该陷入过早的优化并开始构建,如果性能下降,将寻找其他选项
    • 我会说 10,000 个用户(并假设有几十万个关系记录),然后才能开始看到低效设计的真正影响 - 或者更确切地说,使用更高效的设计的真正好处!如果您预计它会变得非常大,我会从偏移量开始进行高效设计。在未来的某个时候必须将数据转换为更具关系性的模式将是一项艰巨的工作。
    • efficient 设计是我所追求的,有什么建议是有效的吗?
    • 再一次,这是一个艰难的决定,但如果你想要一个可以完全处理非常大的数据集的东西,我会选择一个完全关系和规范化的解决方案。这通常意味着要存储大量表来存储数据的规范化排列(例如用户之间的不同关系),但也可以通过仅查询任何给定查询中所需的数据来节省大量空间,通常使它们更快,并且占用更少的磁盘空间.
    猜你喜欢
    • 2020-08-12
    • 1970-01-01
    • 2013-08-21
    • 2011-02-24
    • 2011-01-08
    • 2013-12-16
    • 2018-05-06
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多