我正在设计一个包含下一个要求的聊天数据库:
现在我有了这个:
/*
conversation_table messages_table
+--------------------------------------------+ +----------------------------------------+
| user_id | participant_id | in-out | msg_id | | msg_id | body |
+--------------------------------------------+ +----------------------------------------+
| A | B | 0 | 101 | | 101 | Hello B, what's up |
| B | A | 1 | 101 | | 102 | Hey A, here in stackoverflow |
| B | A | 0 | 102 | | 103 | That's nice B, and what's new |
| A | B | 1 | 102 | +----------------------------------------+
| A | B | 0 | 103 |
| B | A | 1 | 103 |
+--------------------------------------------+
Chat windows
+-----------------------------------------+
| User A |
+-----------------------------------------+
| Sent: Hello B, what's up |
| Received: Hey A, here in stackoverflow |
| Sent: That's nice B, and what's new |
+-----------------------------------------+
+-----------------------------------------+
| User B |
+-----------------------------------------+
| Received: Hello B, what's up |
| Sent: Hey A, here in stackoverflow |
| Received: That's nice B, and what's new |
+-----------------------------------------+
*/

这样。我可以为每个用户分隔他们的完整聊天记录,然后过滤所需的参与者。
将输出消息与收到的消息分开,只需使用输入输出即可。例如,如果收到消息(0)将其放在左侧,或者如果发送了消息,则将其放在右侧。
SQL为用户A获取消息与用户B聊天:
SELECT * FROM conversation_table C INNER JOIN messages_table M ON (C.msg_id=M.msg_id) WHERE C.user_id=A AND C.participant=B
并将用户A的消息插入用户B:
INSERT INTO messages_table (msg_id, body) VALUES (101, 'Hello B, what's up')
INSERT INTO conversation_table (user_id, participant_id, in-out, msg_id) VALUES
(A, B, 0, 101) #messages get out from user A to User B
(B, A, 1, 101) #message comes in to user B from user A
要删除用户A的消息历史记录,与用户B聊天:
首先,检查用户B是否没有删除他们的对话。如果已删除,则将从消息表中删除消息。否则,没有。
DELETE FROM conversation_table WHERE user_id=A AND participant_id=B
这将删除用户A帐户中用户A和B之间的完整对话。用户B拥有它自己的消息副本。
消息表将包含以下元数据:
嗯,一切都在这里工作,但现在有些问题:
谢谢。
答案 0 :(得分:0)
我认为关系数据库很好。大多数人都遵循类似的架构
答案 1 :(得分:0)
我不建议使用 UUID
或 NEWID()
(在 SQL Server
中使用)来存储每条消息,正如您之前建议的那样,将为每条消息生成 32 个字符的 ID。例如,如果您有 1000 个用户,并且每个用户每天发送大约 10 条消息,那么生成的 UID
总数将为 10000,现在您可以计算每周、每月和每年。实际上,它将有更多数据,因此我建议您使用两个值的组合作为唯一标识符。
UserID
和 MessageID
。
将它们标记为 15 位数字值或任何您认为正确的值,然后将它们组合起来以识别每个用户的消息。
示例:
UserID: 1000001
MessageId: 1000001
Message: 'Hello'
UserID: 1000002
MessageId: 1000001
Message: 'Hi'
告诉我你的想法!!
答案 2 :(得分:0)