许多数据库行与一个逗号分隔的值行

Cyb*_*kie 10 php mysql database

我正在创建一个允许网站用户成为朋友的表.我正在尝试确定哪个是最好的桌面设计来存储和返回用户的朋友.目标是快速查询,而不是耗尽大量的数据库空间.

我有两个选择:

每个友谊都有各自的行.

+----+-------------+-------------------+
| ID | User_ID     | Friend_ID         |
+----+-------------+-------------------+
| 1  | 102         | 213               |
| 2  | 64          | 23                |
| 3  | 4           | 344               |
| 4  | 102         | 2                 |
| 5  | 102         | 90                |
| 6  | 64          | 88                |
+----+-------------+-------------------+
Run Code Online (Sandbox Code Playgroud)

或者将所有朋友作为CSV存储在一行中

    +----+-------------+-------------------+
    | ID | User_ID     | Friend_ID         |
    +----+-------------+-------------------+
    | 1  | 102         | 213,44,34,67,8    |
    | 2  | 64          | 23,33,45,105      |
    +----+-------------+-------------------+
Run Code Online (Sandbox Code Playgroud)

在检索朋友时我可以创建一个数组explode()但是删除一个用户会比较棘手.

编辑:对于第二种方法,我会在php中分离数组中的每个id,用于计算和其他功能.

您认为哪种方法更好?

Ali*_*guy 13

第一种方法肯定更好.它是关系数据库很棒的原因:)

它将允许您搜索和分组比第二种方法更具体的标准.

假设您想编写一个查询,以便用户可以看到谁将他们作为朋友.第二种方法需要你使用IN(),并且比简单地使用JOINS慢得多.

  • 这是事实,但是谁在乎呢?假设用户退出网站 - 您是否真的想要搜索每个用户的friend_ID'csv'以查看该用户ID是否存在,如果存在,则重新填充该csv字符串? (3认同)
  • @Cyber​​Junkie信任,这就是为什么建立数据库.正确索引表的10,000行是什么. (2认同)
  • @Cyber​​Junkie是的,在将字符串分解为10,000个数组元素之后,您可以轻松地对数组进行计数,这比使用第一种方法要慢得多,也更加密集.也没有解决"找到有你作为朋友的人". (2认同)
  • @Cyber​​Junkie:如果我有一百万朋友,那就需要一百万行(仅限).在第二种方法中,该场需要多宽? (2认同)

dqh*_*cks 6

第一种方法几乎在所有方面都更好.您不仅可以利用数据库索引更快地查找记录,还可以使修改变得更加容易.


Pau*_*ier 5

使用关系数据库的强大功能。绝对采用第一种方法。MySQL 比您想象的要快,并且它经常处理非常大的数据集。


Con*_*rix 5

第一种正常形式打破通常是不可取的,因为

  1. 易于Orpahned ids
  2. 容易插入无效的数据类型
  3. 更新可能需要全表扫描
  4. 增加并发问题
  5. 无法创建密钥(user_id,friend_id)