0

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

我已经提到了这些问题:

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

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

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

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

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

任何关于模式的建议或想法都非常受欢迎。
如果需要更多信息,请发表评论。

谢谢!

4

2 回答 2

1

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

例如,如果 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 并且不经常更新,那么一些非常低效的设计是完全可以的。如果您要处理数以万计的记录和关系,并且不断更新,那么使设计更高效是非常明智的。

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

于 2012-12-11T12:58:40.827 回答
1

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

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

我希望这有帮助!

于 2012-12-11T12:54:14.927 回答