从数据库中删除“朋友”的最佳做法是啥?
Posted
技术标签:
【中文标题】从数据库中删除“朋友”的最佳做法是啥?【英文标题】:What are best practices for removing "friends" from a database?从数据库中删除“朋友”的最佳做法是什么? 【发布时间】:2010-07-16 06:58:51 【问题描述】:假设您有这样的表架构:friends(friendship_id, uid1, uid2, are_friends)
。
当一个朋友取消了另一个人的朋友时,最好的做法是从数据库中删除该行(并重置自动递增)?还是应该简单地将 are_friends 状态更改为“N”?
我很想知道你的想法和原因。
编辑:我主要关心的是显示一些关于朋友状态的信息,以及显示谁加了谁。这样,在添加时,我可以将好友的请求通知给好友,但尚未让他们成为好友。
我最初将are_friends
用作大号ENUM
,并提供更多选项。但在那个ENUM
中,我有removed
和blocked
之类的选项,我不确定这是否是真正有用的数据。关于拥有更多与更少数据的优点有什么进一步的想法吗?
另外,自从我发帖以来,我还有一个问题是应该如何避免重复友谊。您应该将(uid1, uid2)
设为主键吗?
【问题讨论】:
您要保留多少信息?如果你在 Facebook 工作,看起来你将不得不保留一个额外的表来维护友谊历史,当然永远不要删除它...... 【参考方案1】:如果用户与其他用户重新成为朋友,是否有任何与 friend
记录相关的数据您可能想要恢复?
如果您想跟踪他们的历史,或保留一些与他们的关系相关联的元数据,请保留记录。
如果您不想跟踪他们的历史记录,并且以后重新加好友不需要用户输入任何额外数据,请将其删除。您将拥有更小的表格、更轻松的查询,并降低您忘记 where 子句并显示他们已删除的用户朋友的可能性。
【讨论】:
如果能够跟踪一个朋友是否接受了另一个朋友呢?这是我最关心的问题。否则我之前曾想过类似的事情:ENUM('pending', 'accepted', 'rejected' ...)
【参考方案2】:
典型的 N:M 关系:
关系表中不需要friendship_id
和are_friends
字段。
这样,如果表中的关系存在,则用户是朋友,否则不是。
存储“不是朋友”是无用的混乱。 除非@fencliff 描述的情况
无论你做什么:除非你重置整个数据库,否则永远不要重置自动增量。
【讨论】:
我真的很好奇为什么不应该重置自动增量。请告诉我。【参考方案3】:我建议删除该行,因为首先是不需要占用空间的数据,而且下次用户决定与同一个朋友重新加好友时,我们可以再次输入数据,如果需要的话。
【讨论】:
这也是我的直觉。【参考方案4】:我会说删除它。确认默认状态的不必要数据并没有多大意义,尤其是即使是一个很小的站点也可能会累积这些数据的数量。如果您要在其中存储额外的有用数据,也许只是更改,否则没有意义。
【讨论】:
【参考方案5】:我想说这首先取决于您的业务需求。如果您需要跟踪这两个人曾经是朋友并且不再是朋友的事实,那么您必须将该行保留在您的数据库中,可能还会添加一些您可能感兴趣的列(当他们成为朋友时,当他们不再是朋友时,等等)。否则,您实际上并不需要此行,因此最好将其删除。当然,在这种情况下,您也不需要 are_friends 列,因为您的数据库中存在的所有行都将对应于成为朋友的人。
【讨论】:
以上是关于从数据库中删除“朋友”的最佳做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 jquery 删除活动存储附件并重新渲染附件有帮助吗?最佳做法是啥?