我正在尝试设计具有私人聊天和群聊功能的数据库架构。这是我到目前为止所得到的:
所以 - 理论上说,即使用户只是一对一的私人聊天,他们仍然被分配了一个'roomID',他们发送的每条消息都是TfsMigrator import /importFile:C:\TFSDataImportFiles\import.json
。
为了找出他们所涉及的所有房间,我可以从表room
中选择一个列表来查找。
这没关系,但是我觉得participants
表格略显多余,因为我不需要房间名称,我可以将其删除,只需使用{{1} } table和room
找出各个房间。
任何人都可以向我解释一个更好的结构或为什么我应该保留房间表?
答案 0 :(得分:3)
您的架构看起来很好,您可能会看到其他架构(包括今天的我自己)之前(Storing messages of different chats in a single database table,Database schema for one-to-one and group chat,Creating a threaded private messaging system like facebook and gmail)具有相同的结构。我真的很想指出,您的视觉表现是最出色的,它很容易理解和遵循:)
总的来说,我认为即使您目前没有特定的属性(例如,name
,posting_allowed
,拥有“房间”(“聊天”,“对话”)也很有意义。 type
(例如,如果您不仅对私人消息和聊天使用类似的结构,而且对带有评论的公共帖子也使用了类似的结构),依此类推。具有单个索引ID的单个表应该非常快,并且开销几乎为零,但是,它无需修改所有现有代码即可轻松扩展(例如,有一天您决定向聊天添加name
)。
在participants
表中保留“ roomID”逻辑不会是透明的,也不会高效(即,当您需要查找聊天的下一个ID时),我不建议这样做。
答案 1 :(得分:0)
我认为您可能需要稍微优化一下您的域名模型 - 如果不这样做,很难说您的架构是否正确"。
将Slack作为一个模型(注意 - 我还没有对此做过大量研究,所以细节可能是错误的),你可能会说你的系统有#34;聊天"。
聊天可以是公开的 - 即列出供所有用户查看和加入 - 或私密 - 即不是为所有用户列出,只能通过邀请获得。
公开聊天必须有一个"名称"属性。私人聊天可能有也可能没有名称属性。
聊天可以有2..n个参与者。
默认情况下,所有1-1个聊天都是私密的。
可以将私人聊天更改为公开聊天。
在这种情况下,你有一个继承/专业化关系 - "私人"和#34;公共"是" chat"。
的子类型答案 2 :(得分:0)
对于带有群组和私人聊天的简单聊天系统(两个成员),我会更喜欢这样做。
另一个可能性是仅为群组消息创建一个表,为私有聊天创建一个表。 (为了避免组和消息表之间的n:m,或者你使用n:m就像一个特性而不是一个有缺陷的bug /逻辑错误)。如果你想要一个更复杂的聊天系统,请看Neville Kuyt的帖子。
我希望我能帮到你。
答案 3 :(得分:0)
我知道这在游戏中有点晚了,但我已经制作了其中的一些并且在消息表中总是有一个 active type bool
列。以防万一有人说了些什么,您可以将其隐藏,但仍要记录下来。以及用户表中的 user_auth
。有时我会在房间的桌子上放 auth_required -> user.user_auth
以防你想要像许多不和谐一样的水平对话,并且总是在消息列中添加 datetime
。这些是最低标准,因为如果没有这些标准,您以后会后悔..