我正在开发某种类型的私人对话网站,我正在将对话存储在一个表上(消息存储在另一个表上)
格式:
- Id:自动递增
- 标题:Varchar,代表对话的名称
- Members:保存具有会话访问权限的成员id
我的问题是,我存储成员的方式实际上是可怕的。我用的是user1Id;user2Id;user3Id
当试图获取特定玩家的所有对话时出现问题。
我的问题是:有没有更好的存储id的方法?(如果可能的话,在一个字段上)并且还能够选择特定id的所有对话?
"正确的"、规范化的数据库方式应该是有另一个表member_conversation_map
,它有两列——成员ID和会话ID,并使用in
操作符来查询它:
SELECT *
FROM conversations
WHERE id IN (SELECT conversation_id
FROM member_conversation_map
WHERE member_id = 123)
如果这不是一个选项,并且您必须在数据库中的单个单元格中拥有成员id,那么至少使用逗号而不是分号作为分隔符。这将允许您使用MySQL的find_in_set
:
SELECT *
FROM conversations
WHERE FIND_IN_SET('123', members) > 0
为什么不为会话表创建一个成员呢?在这里你可以像这样存储成员和对话
member_id | conversation_id
1 | 1
2 | 1
3 | 1
1 | 2
2 | 2
表示成员1、2和3属于会话1,成员1和2属于会话2
我就是这样做的,这样做效果很好。
如果您仍然希望将它们存储在一个字段中,那么您的方式将是最好的,因为您可以通过它们的分隔符将它们分开,并以这种方式将所有id存储在数组中。但正如您所指出的,通过用户id获取对话使用此方法会很快变得混乱。
一种存储方法是使用json数组:定义member_ids到VARCHAR并存储特权id,如:
["11","1","2","3"]
使用json_decode可以在需要时获取成员