优化MySQL中的友元关系存储

时间:2015-05-04 09:31:45

标签: php mysql database

假设

  1. 如果A是B的朋友,B也是A的朋友。
  2. 我搜索了这个问题,Stack Overflow上已经有很多问题了。但他们都提出了相同的方法。

    他们正在创建一个表friend,并有三列fromtostatus。这有两个目的:如果status被接受,谁发送了朋友请求以及谁是朋友。

    但这意味着如果有m个用户,并且每个用户都有n个朋友,那么我会在好友表中有mn行。

    我的想法是将好友列表存储在text列中。对于每个用户,我只有一行和friends列,其中所有已接受的朋友的ID都由一个字符分隔,请说|我可以将其展开以获取所有朋友列表。同样,我将有另一个名为pending requests的列。接受请求后,ID将从pending requests移至friends列。

    现在,这应该会显着减少表格中的条目和搜索时间。

    唯一的开销是当我必须删除朋友时,我将不得不检索朋友字符串,搜索要删除的朋友的ID,删除ID并更新列。但是,如果我假设一个用户不能超过2000个朋友,这几乎可以忽略不计。

    我认为我肯定会忘记某些情况,否则这种方法会有一定的陷阱。所以请更正。

1 个答案:

答案 0 :(得分:2)

答案是否定的!不要试图实现这个想法 - 它完全是灾难。

我将更准确地描述原因:

  1. 关系。您只存储与|分开的密钥。如果您想显示包含朋友名字的列表怎么办?您必须获取列表,将其展开并向DB发出另一个n个查询。使用关系表from | to | status,您可以使用一个JOIN
  2. 执行此操作
  3. 缺失。太可怕了。
  4. 插入。对于每个插页,您需要SELECT + UPDATE而不是INSERT
  5. 类型。您应该按原样保留DB中的项,因此整数为整数。将int转换为字符串和返回可能会导致一些错误,错误等。
  6. 没有ORM支持。将来你可能会为一些框架留下简单的PHP。请记住,他们都不会支持你的想法。
  7. 搜索时间? 请做一些测试。使用WHERE + PRIMARY KEY进行搜索非常快。