mysql:在一行中存储id列表或将每个id存储在自己的行中?

时间:2016-04-20 15:10:19

标签: php mysql database database-design

假设我有一个表'User_Friendlist'

列:

'id(Primary Key)', 'User_ID',''Friendlist_IDs'

的值如下:

'1','102','2:15:66:35:26:17:'
'2','114','1:12:63:33:24:16:102'
'3','117','6:24:52:61:23:90:97:118'
.......
.......

“:”是PHP中“爆炸”到数组

时的分隔符

这是存储“朋友列表”ID列表的正确方法吗?

而不是单个行中只有1个单独的“朋友”ID

SELECT * FROM 'User_Friendlist' WHERE 'User_ID = XXX'?

2 个答案:

答案 0 :(得分:0)

可能您应该添加一个新表来在不同用户之间建立联接。

所以有两个表:

Users
   - id
   - user_id

Users_friends
   -user_id
   - friend_id

然后您的Users_friends看起来像:

   Users_friends
===================
user_id | friend_id
-------------------
102     | 2
102     | 15
102     | 66
102     | 35
102     | 26
102     | 17
      ....

答案 1 :(得分:0)

您应该考虑使用方案。 E.g。

1)您希望以分页方式显示用户的朋友。从表中进行简单的选择需要获取朋友字符串,解析它,获取朋友窗口

2)根据报告制作一些报告 - 其他难看的字符串处理

关系数据库不适合字符串处理,因为它往往非常慢。目标是规范化和基于集合的操作(不是迭代)。

您可以认为任何人都是用户。因此

用户

UserId PK
Username

和友谊是两个用户之间的关系。

友谊

FirstUserId FK -> User
SecondUserId FK -> User
PK_Friendship (FirstUserId, SecondUserId) 

当您想要添加与友谊相关的内容时,这可以实现自然增长。例如。朋友从 - >开始只是友谊表中的日期/时间字段。

当然,当您想要与朋友相关的信息时,会有更多体面的查询。