SQL - 用于删除一方或两者的会话的聊天数据库模式

时间:2016-01-16 05:10:58

标签: sql chat

我正在设计一个包含下一个要求的聊天数据库:

  • 仅限私人消息,A至B.无组别或房间。
  • 当用户A向B发送消息时,如果用户A删除了会话,则用户B仍然可以查看该会话,直到用户B删除该会话。
  • 不会单独删除邮件。只能删除完整的历史记录对话。

现在我有了这个:

  • 当用户A向用户B发送消息时,将创建一个带有id的消息寄存器。这将是会话表的外键。
  • 在会话表中,将为同一消息ID创建两个寄存器。一个用于发送消息的用户,另一个用于接收消息的用户。每个寄存器都有一个名为in-out的字段,其中指定是发送还是接收消息。例如:



/*
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拥有它自己的消息副本。

消息表将包含以下元数据:

  • 获取日期时间和可视化顺序的时间戳(UTC当前毫秒)

嗯,一切都在这里工作,但现在有些问题:

  • 所呈现的设计是否能成为处理数千名用户的好模型?我的意思是,为每个用户存储他们的传入和传出消息。
  • 消息ID怎么样?我正在考虑一个有32个字符的UUID。这个是可以建议的? (推荐的)。我的意思是如果消息只包含一个带有" hello"的主体,则需要一个32个字符的唯一ID,我认为这是不必要的,或者不是吗?
  • 你能帮我指导一下这个设计吗?

谢谢。

3 个答案:

答案 0 :(得分:0)

我认为关系数据库很好。大多数人都遵循类似的架构

答案 1 :(得分:0)

我不建议使用 UUIDNEWID()(在 SQL Server 中使用)来存储每条消息,正如您之前建议的那样,将为每条消息生成 32 个字符的 ID。例如,如果您有 1000 个用户,并且每个用户每天发送大约 10 条消息,那么生成的 UID 总数将为 10000,现在您可以计算每周、每月和每年。实际上,它将有更多数据,因此我建议您使用两个值的组合作为唯一标识符。 UserIDMessageID。 将它们标记为 15 位数字值或任何您认为正确的值,然后将它们组合起来以识别每个用户的消息。

示例:

UserID: 1000001
MessageId: 1000001
Message: 'Hello'

UserID: 1000002
MessageId: 1000001
Message: 'Hi'

告诉我你的想法!!

答案 2 :(得分:0)

enter image description here

此数据模型应该适合您的任务。对于会话应该设置“级联删除”。

DELETE FROM Sessions WHERE DeleteFrom=1 AND DeleteTo=1

它将删除两个用户删除的所有会话和消息。当用户删除会话时 SET DeleteFrom/To = 1.

Id 是 IDENTITY = 自动增量。 Order By Id 提供消息的顺序。

如果消息来自 UserIdFrom,则添加“From BIT”= 1,如果 - 来自 UserIdTo,则添加 = 0。

enter image description here