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

Mysql 用于存储友谊详细信息的数据库架构,mysql,database,database-design,Mysql,Database,Database Design,我正在创建一个应用程序,用户按顺序使用她的twitter/facebook/foursquare帐户登录,并获取她正在跟踪的人的所有ID和其他详细信息(或将他们作为朋友放在她的列表中) 我已提及这些问题: 但唯一的问题是,上述设计侧重于“友谊”模式,而我希望系统基于“跟随”模式。 在“友谊”模型中,两个用户都可以相互添加/确认,而在“跟随”模型中,一个用户可以跟随另一个用户,而无需确认 我可以继续设计一个表,其中一个表存储我应用程序的所有用户,另一个表存储他们跟随的所有人以及其他信息,但

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

我已提及这些问题:

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

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

  • 如果Kathy在某个网络上跟踪Ana,Steve在另一个网络上跟踪Ana,我会为Ana设置两行,描述与这两个用户的关系。这样好吗
  • 如果在不同的网络上,安娜和史蒂夫互相跟踪呢?这种关系可以避免两行吗
  • 在某些网络上,史蒂夫跟踪凯西,这将再次为他们的关系排上一行。这样行吗
  • 安娜很可能是凯西在不止一个社交网络(twitter+facebook)上的朋友,我必须用两行为同一个人安娜存储这两个网络的不同信息。这样好吗
我不是专业的时候,在数据库设计,通常是从db的家伙设计,但这次是我的个人应用,所以我不知道什么是好的和什么不好

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

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


谢谢

如果希望规范化数据库,则需要为每个关系单独设置一行。如果您存储了所有关系,比如说,将followers id放在一个名为followerID的字段中,那么如果该记录基于一个follower被删除,则所有followers都会被删除。是的,多张唱片是个好主意

您还可以使用followerd和follower的主键以及您需要的任何其他相关信息,基于类似Follow_的关系建立一个关系表。这样,您就可以在两个表上执行联接


我希望这有帮助

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

例如,如果Steve和Ana在任何网络中连接,则该关系可以在一行中表示,并添加列以表示不同的follow/friend关系。如果用户数量有限,这可能是可以接受的,以便于使用,同时兼顾设计效率

对于大型数据库,建议使用适当的关系,我想说的是,对于与每个用户的每个关系,都需要一个明确的记录。如果您有两个用户相互跟踪的场景,我想您可以针对两个用户之间的单个记录设置一个“isReciprocal”标志:

User1|User2|isReciprocal
Steve|Kathy|1
其中,当isReciprocal=1时,它们彼此跟随,如果为0,则Steve跟随Kathy,但Kathy不跟随Steve

如果关系发生变化(Steve解除跟踪Kathy,Kathy开始跟踪Steve),那么这种关系可能会发生变化,因此Kathy是User1,Steve是User2。希望这是明确的

最终,尽管设计是一个规模问题。如果你的用户少于10000,并且很少更新,那么一些非常低效的设计是非常好的。如果您要进入数以万计/几十万的记录和关系,并且不断更新,那么让设计更高效是非常明智的


通常,一个小而快速的解决方案可能会被过度设计,我认为在这些情况下,非规范化的数据是可以接受的,这样您就可以轻松使用

这非常有帮助,尽管我将不得不再次盘问我关于连接的知识:PI确实得到了您的
isReciprocal
概念。谢谢“10000用户”是指总共10000条记录?如果你指的是10000个用户,然后是他们不同的朋友,那么它将变得巨大。但是,是的,我不应该过早地进行优化并开始构建,如果性能下降,在您开始看到低效设计的真正影响之前,我会寻找其他选择,比如10000个用户(并假设有几十万个关系记录),或者更确切地说,使用更高效的设计的真正好处!如果你预计它会变得非常大,我会选择从偏移量开始的高效设计。在将来的某个时候,必须将数据转换为更为关系化的模式将是一项艰巨的工作。我追求的是
高效的设计,有什么建议是一种高效的设计吗?同样,这是一个困难的要求,但如果您想要能够完全处理非常大的数据集的设计,我会选择一个完全关系化和规范化的解决方案。这通常意味着需要大量的表来存储数据的标准化排列(例如,用户之间的不同关系),但也可以通过仅查询任何给定查询中所需的数据来节省大量空间,通常会使查询速度更快,占用更少的磁盘空间。