我有一个关于在数据库中存储数据的简单但重要的问题。
假设一个网站有 100,000 个用户 。这些用户可以互相成为 friend 。
哪种存储方法是理想的

方法 A:

  • 在 USERS 表中创建一个 friends 字段。类型:文本
  • 将所有好友 ID 保存在其中,并使用 , 连接它们。示例:用户 1 的 friend :2,3,4,5,6,...
  • 最糟糕的状态:所有用户都是 friend ,每个用户都有一个 FULL TEXT friend 字段。所以在 php 端,应该用 , 分隔符分隔这个字段,这需要一些过程。

  • 方法 B:
  • 创建一个 friendship
    +------+---------------------+
    | uid  | friend_id           |
    +------+---------------------+
    | 1    | 2                   |
    | 1    | 3                   |
    | 1    | 4                   |
    | 1    | 5                   |
    +------+---------------------+
    
  • 如上所示,对于用户的每个 friend ,我应该向表中插入一个新行。
  • 最糟糕的状态:所有用户都是 friend ,所以 100,000 x 100,000(不确定)行应该存储在表中。

  • 这两种方法哪个好?性能和优化。

    提前致谢。

    最佳答案

    根据 normalization theory 的说法,首选方法 B

    方法 将有以下问题:

  • 较慢,因为在大多数情况下字符串搜索需要更多时间,而整数比较更快。
  • 保持参照完整性是一个问题。例如,如果您删除任何用户的好友,则应将其从他们的好友字段中删除。这将需要很多时间,因为 DBMS 将不得不执行大量的字符串处理操作。
  • 在这种情况下构建复杂查询可能会出现问题。

  • 而这只是问题的冰山一角。如果用户表位于数据库模式的中间(因为它经常发生),它将导致总数据库速度变慢。我的意思是,如果它将链接到许多其他表。

    您可以从 方法 B 轻松恢复 方法 A 表示:
    SELECT
        `User`.`uid` as `user`,
        GROUP_CONCAT(`Friendship`.`friend_id`) as `friends`
    FROM
        `User` LEFT JOIN `Friendship` ON `User`.`uid` = `Friendship`.`uid`
    GROUP BY
        `User`.`uid`
    

    但是,从 方法 A 开始,获得 方法 B 表示可能是一项复杂的任务。考虑一下。

    关于php - 哪种方法更好地将相关数据存储在表中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19549372/

    10-14 15:54
    查看更多