我应该如何设计我的PosgreSQL数据库以容纳私人聊天,群组聊天和公共聊天?

时间:2018-09-26 02:33:35

标签: sql postgresql database-design chat

我正在创建一个小型消息传递应用程序,用户可以在其中将消息发送至:

  • 常规聊天-(所有人)
  • 私人聊天-(2位用户之间)
  • 群聊-(超过3个用户)

我还是数据库设计的新手,想对如何设计数据库有一些见解。

什么能让我拥有这些功能的良好设计/架构?

现在我有一个看起来像这样的模式:

CREATE TABLE ChatRooms (
id serial PRIMARY KEY,
);


CREATE TABLE ChatMessages (
id serial PRIMARY KEY,
roomID FOREIGN KEY NOT NULL,
message VARCHAR(100),
senderID FOREIGN KEY NOT NULL, 
time TIMESTAMP
);

还有一个带有用户ID的User表。我还需要更多桌子吗?

1 个答案:

答案 0 :(得分:1)

我建议的设计:

**ChatRooms**        **ChatMessages**    **ChatUsers**
room_id              id                  user_id
serial               room_id             room_id
type (0/1/2)         sender_id           added_on (timestamp)
users (user count)   text
                     time (timestamp)

现在“类型”将指示房间是general(0),group(1)还是private(2)的天气。 每当用户加入聊天室时,他们的信息都将使用特定的聊天室ID添加到ChatUsers表中,并且当他们离开该聊天室时,该行将从ChatUsers表中删除。 ChatUsers表的好处是,当您将显示一个房间中的总用户时,您不必计数ChatUsers表中的所有行,而只需从“用户”列的ChatRooms表中选择与行相等的值即可。在ChatUsers表中特定房间的数量时,每次将行添加到ChatUsers表中时,您需要增加房间的用户列;当删除具有该房间ID的行时,也需要减少该房间的用户列。您还可以显示房间中用户的信息通过从“ room_id”列中具有特定房间ID的行中选择“ user_id”列值,然后从用户表中检索具有这些ID的以下用户的信息。

我希望这就是您想要的。