【发布时间】:2018-02-20 15:12:02
【问题描述】:
我正在创建的消息传递应用程序具有以下数据库架构:-
表名:- conversation_threads
+-----------------+-------+---------+
| conversation_id | label | members |
+-----------------+-------+---------+
| 1 | TEST | 1,2 |
+-----------------+-------+---------+
| 2 | XYZ | 4,1 |
+-----------------+-------+---------+
表名:-messages
+------------+----------------+-----------+-----------------+---------------------+
| message_id | message | sender_id | conversation_id | created_at |
+------------+----------------+-----------+-----------------+---------------------+
| 1 | Hello | 1 | 1 | 2017-09-12 09:00:00 |
+------------+----------------+-----------+-----------------+---------------------+
| 2 | Hi | 2 | 1 | 2017-09-12 09:02:00 |
+------------+----------------+-----------+-----------------+---------------------+
| 3 | Hey! | 4 | 2 | 2017-09-12 08:16:00 |
+------------+----------------+-----------+-----------------+---------------------+
表名:-message_users
+----------+-------------+---------+--------+
| mu_id | message_id | user_id | status |
+----------+-------------+---------+--------+
| 1 | 1 | 1 | READ |
+----------+-------------+---------+--------+
| 2 | 1 | 2 | UNREAD |
+----------+-------------+---------+--------+
| 3 | 2 | 2 | READ |
+----------+-------------+---------+--------+
| 4 | 2 | 1 | UNREAD |
+----------+-------------+---------+--------+
| 5 | 3 | 4 | READ |
+----------+-------------+---------+--------+
| 6 | 3 | 1 | UNREAD |
+----------+-------------+---------+--------+
此架构非常适合一对一消息传递。
但现在我想在一次对话中介绍超过 2 个用户,以便所有 3 或 4 人或更多人都可以协作和讨论事情。
我面临的问题是,如果我在对话线程的 members 字段中添加另一个用户 - 他可以访问从一开始就阅读该特定对话线程中存在的所有消息 - 尽管他被添加到后期对话。
请为我提供如何解决此特定问题的解决方案。
希望我的问题不要太宽泛。
【问题讨论】:
-
不是太宽泛,但可能之前被问过很多次。除了
conversation_threads表中的 CSV 数据外,它看起来不错。摆脱它。 -
@TimBiegeleisen - 所以如果我删除
members列 - 我需要引入另一个表来存储conversation_thread_members吗?以及如何解决仅向线程成员显示他加入对话后传达的那些消息的问题? -
啊,我明白了!因此,如果我添加另一个用户 - 他将只获得在
message_users表中为其分配了用户 ID 的那些消息。因此,如果我需要广播一条小的特殊(突出显示)消息,例如“用户 A 加入对话” - 我只需将其存储为带有一些额外信息的消息,即这是一条“突出显示”消息。也许是一个包含其类型的标志字段。所以正常情况下它会是“TEXT”消息,对于这个它会是“HIGHLIGHT” -
我没有完全按照您的设计,但是如果您将每个 CSV 值分成单独的行,您通常会更容易查询。
-
好的 - 我会将 CSV 值分成一个单独的表,每个成员 ID 位于单独的行中。我想你是对的,这将使查询更容易。
标签: mysql database database-design chat messaging