假设
- 如果 A 是 B 的好友,则 B 也是 A 的好友。
我搜索了这个问题,Stack Overflow 上已经有很多问题了。但他们都提出了相同的方法。
他们正在创建一个表 friend
,并具有三列 from
、to
和 status
。这有两个目的:谁发送了好友请求,以及如果状态
被接受,谁是好友。
但这意味着如果有 m
个用户,并且每个用户有 n
个 friend ,那么 friend 表中将有 mn
行。
我的想法是将好友列表存储在 text
列中。对于每个用户,我都有一行和一个 friends
列,其中包含所有接受的 friend 的 ID,并用字符分隔,例如 |
我可以分解它以获取所有 friend 列表。同样,我将有另一个名为 pending requests
的列。接受请求后,ID 将从待处理请求
移至 friend
列。
现在,这应该会显着减少表中的条目和搜索时间。
唯一的开销是当我必须删除 friend 时,我必须检索 friend 字符串,搜索要删除的 friend 的 ID,删除 ID 并更新列。但是,如果我假设用户不能拥有超过 2000 个 friend ,则这几乎可以忽略不计。
我认为我肯定会忘记一些情况,或者这种方法会有一定的陷阱。如果有的话请指正。
最佳答案
答案是否定的!不要尝试实现这个想法 - 这完全是一场灾难。
我将更准确地描述原因:
- 关系。您仅存储用
|
分隔的键。如果你想显示好友名单怎么办?您将必须获取列表,分解它并向数据库进行另一个n
查询。与关系表from |至 | status
,您只需一个JOIN
就可以做到这一点。 - 删除。太可怕了。
- 插入。对于每个插入,您都需要执行
SELECT + UPDATE
而不是INSERT
。 - 类型。您应该将项目按原样保留在数据库中,因此整数作为整数。将整数转换为字符串并返回可能会导致一些错误、错误等。
- 不支持 ORM。将来您可能会将纯 PHP 留给某些框架。请记住,他们都不会支持您的想法。
搜索时间?
请做一些测试。使用 WHERE + PRIMARY KEY
进行搜索非常快。
关于php - 优化MySQL好友关系存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30026793/