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

时间:2011-07-09 00:21:34

标签: 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                |
+----+-------------+-------------------+

或以CSV格式将所有朋友存储在一行

    +----+-------------+-------------------+
    | ID | User_ID     | Friend_ID         |
    +----+-------------+-------------------+
    | 1  | 102         | 213,44,34,67,8    |
    | 2  | 64          | 23,33,45,105      |
    +----+-------------+-------------------+

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

编辑:对于第二种方法,我会将php中数组中的每个id分开来计算其他函数。

您认为哪种方法更好?

4 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:5)

通常不希望与1st normal form分手,因为

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

答案 3 :(得分:4)

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