存储友谊详细信息的数据库架构

时间:2012-12-11 12:45:22

标签: mysql database database-design

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

我提到了这些问题:

但唯一的问题是,上述设计专注于“友谊”模式,而我希望将系统建立在“跟随”模式上。
在“友谊”模型中,两个用户互相添加/确认,而在“跟随”模型中,一个用户可以跟随另一个用户,而无需确认。

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

  • 如果Kathy在某个网络上关注Ana,Steve会在其他网络上关注Ana,最后我为Ana安排了两行,描述了与这两个用户的关系。这样好吗?
  • 如果在不同的网络上,Ana和Steve会互相关注怎么办?这种关系有两行可以避免吗?
  • 在一些网络上,史蒂夫跟随凯西,他们的关系将再次排成一行。这没关系吗?
  • Ana很可能在不止一个社交网络(twitter + facebook)上成为Kathy的朋友,而且我必须有两行用于为同一个人Ana存储这两个网络的不同信息。这样好吗?

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

由于不同的用户最终添加了多个社交网络帐户,因此该系统可能会变得非常大。我将在开始时使用LAMP,并且基本上担心糟糕的数据库设计可能会增加的复杂性。

对图式的任何建议或想法都深受欢迎 如果需要更多信息,请发表评论。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果要对数据库进行规范化,则每个关系都需要单独的行。如果您存储了所有关系,请将关注者ID放在名为followerID的字段中,然后如果基于一个关注者删除该记录,则会删除所有关注者。所以是的,多个记录是个好主意。

您还可以使用跟随者和关注者的主键以及您需要的任何其他相关信息来设置基于Follow_Relationships的关系表。这样,您就可以在两个表上执行连接。

我希望这有帮助!

答案 1 :(得分:1)

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

例如,如果Steve和Ana在任何网络中连接,则该关系可以在具有添加列的单行中表示,以表示不同的跟随/朋友关系。如果您的用户数量有限,这可能是可以接受的,因为在设计效率方面需要权衡。

对于大型数据库,建议建立适当的关系,我会说每个用户的每个关系都需要一个不同的记录。如果你有两个用户互相关注的场景,我想你可以对两个用户之间的一条记录有一个'isReciprocal'标志:

User1|User2|isReciprocal
Steve|Kathy|1

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

如果关系发生变化(史蒂夫取消了Kathy,Kathy开始关注史蒂夫),那么这种关系可以改变,以便Kathy是User1,而Steve是User2。希望很清楚。

最终虽然设计是一个规模问题。如果您拥有少于10000个用户并且更新很少,那么一些非常低效的设计是完全正常的。如果你正在进入数十/数十万条记录和关系,不断更新,使设计更有效是非常可取的。

通常可以过度设计一个小而快的解决方案,我认为在这些情况下,非标准化数据对于您获得的易用性是可接受的。