如何为两个不同实体之间的复杂消息系统设计表?

Posted

技术标签:

【中文标题】如何为两个不同实体之间的复杂消息系统设计表?【英文标题】:How to design tables for a complicated messaging system between two different entities? 【发布时间】:2019-08-26 23:27:50 【问题描述】:

我正在开发一个包含消息传递系统的 Web 应用程序。 Web 应用程序有一个基本实体(用户),用户可以在应用程序中拥有另一个实体(公司),每个公司可能有多个用户(将其视为团队的员工)。用户可能不一定与公司有关系。公司必须与至少一个用户有关系。

我正在尝试在应用程序内创建一个消息传递系统(更多的是应用程序内电子邮件系统而不是聊天)系统。但是,消息系统对谁可以向谁发送消息有一定的限制:

用户可以向公司发送消息 公司可以向用户发送消息 公司可以向公司发送消息

我们将为用户和公司提供两个不同的收件箱/发件箱。这意味着在仪表板中,如果用户拥有一家公司,他将拥有一个指向他自己的用户收件箱的页面,以及一个用于他公司收件箱的页面。

我的问题是确定发送者和接收者的实体,我似乎无法为消息表找到一个好的可维护表设计。 下面是 users 表、companys 表和 company_users 表的结构:

我想到的设计(实施后我认为这不是最好的设计)是每行都有一个sender_user_id 字段和一个sender_company_id 字段。如果sender_user_id 为空,而sender_company_id 已设置。这意味着此消息的发件人是一家公司,反之亦然。接收器也是如此。下面是messages表的设计

有没有人想到更好的设计?也许更可维护的东西?这目前是后端的关系地狱。谢谢。

【问题讨论】:

所以用户不能向用户发送消息? 【参考方案1】:

以 Microsoft ExchangeServer 及其单实例存储为例,我认为您缺少的是指针。

如果您的用例回到单个发件人可以向单个收件人发送单个消息,那么我认为您的架构几乎会成功。

如果您希望某个人(例如公司管理员)能够向公司的所有成员发送消息,那么您的实际意思是:

“我希望公司管理员将指向邮件的指针发送给公司的所有当前成员”。

我的意思是,当他们发送消息时,他们实际上是在为原始消息创建 message_pointers。这样,当收件人删除“邮件”时,他们实际上所做的只是删除了他们对该邮件的个人引用。

这有帮助吗?

【讨论】:

以上是关于如何为两个不同实体之间的复杂消息系统设计表?的主要内容,如果未能解决你的问题,请参考以下文章

两个表之间的数据库消息系统

如何为特定令牌、颤振、firebase 消息传递和 node.js 发送通知

Flutter:如何为 StreamBuilder 制作 http 流

UNIX 系统消息队列机制及应用

如何为 UART 传输设置消息的开始字节

如何用消息系统避免分布式事务?