我正在为一个非常大的聊天应用程序设计一个模式。我在使用 MongoDB 和 Cassandra 等 NoSQL 数据库时遇到了问题。架构的某些部分是关系的,我决定同时使用 PostgreSQL 和 MongoDB。
聊天和成员存储在 PostgreSQL 中,消息存储在 MongoDB 中。
两个数据库中都有一个名为 events 的表。我只保留 PostgreSQL 中事件的 chat_ids 和创建时间以及 MongoDB 中的事件数据。
这些事件包括remove_message
block_user
等。
请注意,这longtext
意味着json
问题
如果我同时使用两者,我会遇到什么问题?
有什么要改变的吗?
更新
消息模式
{
_id: ObjectId,
user_id: Number,
chat_id: Number,
random_id: String,
peer: {
type: [Number],
default: []
}
message: String,
type: {
type: String,
enum: ["service-message", "text", "image", "video", "voice"]
},
reply_to: {
message_id: ObjectId,
user_id: Number
},
forwarded_from: {
message_id: ObjectId,
user_id: Number,
chat_id: Number,
}
deleted_for: {
type: [Number],
default: []
},
author_signature: String,
restriction_reason: String,
number_of_forwards: {
type: Number,
default: 0
},
is_read: {
type: Boolean,
default: false,
},
is_deleted: {
type: Boolean,
default: false,
},
is_private: {
type: Boolean,
required: true
},
is_edited: {
type: Boolean,
default: false,
},
created_at: {
type: Number,
default: Date.now
},
updated_at: {
type: Number,
default: Date.now
}
}
这有望间接回答您的问题并为您指明正确的方向,在评论中讨论太多了。
MongoDB 在写入数据方面的性能并不比任何其他主流关系数据库(PostgreSQL、SQL Server 等)都高。读取数据也是如此。NoSQL 的发明并不是为了提高读取、写入或查询数据的性能,而是最初创建它是为了提高开发人员速度的工具,尤其是在具有高度变化或可变模式的情况下。由于不必担心在数据层和应用程序层中维护对象结构,NoSQL 数据库允许具有特定开发需求的开发人员在管理高度变化的模式时更快地发布软件更改。
据我所知,您的
messages
实体是结构化的,但消息文本的内容可能不是(文本示例会有所帮助)。如果您想对所有数据使用关系数据库系统,您可以将文本解析为关系模型,也可以将其存储为单个文本字段,就像您当前建模的实体一样。分片可能更容易,但最终一致性的一般权衡(同一个表的两个实例在给定时间点不同步)。何时使用分片取决于几个因素,通常取决于一个人愿意支付多少费用来配置他们的服务器与他们需要存储多少数据,具体取决于他们的具体用例。但总的来说,如果架构得当,现代关系数据库系统可以很好地处理大数据,而且我还没有发现共享比垂直扩展更有用。
综上所述,我
Messages
也在一个大型且交易量很大的关系数据库中处理数据(金融交易消息)。一些表达到了数十亿行和数 TB 大小的单个表。Messages
当它们进入我们的系统时,我们将未解析的原始数据存储在一个表中,但编写了一个应用程序,该应用程序也将相关信息从表中解析Messages
为规范化表。通过使用两个不同的数据库系统,您会发现主要的两个挑战是:
管理两个不同系统中的数据,尤其是随着数据的增长:NoSQL 数据库系统的管理需要与关系数据库系统不同的思考、规划和关注。
以有意义的方式跨系统关联数据:应用程序使用数据或用于报告目的变得更加复杂,并且依赖于两个不相关的系统。将相关
messages
数据与您的其他数据相关联users
变得更加复杂,实际上可能效率较低,因为您需要两种不同的方法来检索数据,这将导致更多步骤关联数据。例如,如果您想获得users.full_name
他们messages
创建的。大多数现代关系数据库系统也可以存储、解析和查询“非结构化”数据,因为这实际上是结构化数据的子集。例如,Vérace 提到的 PostgreSQL 的 JSON 功能使其成为关系数据和任何其他非结构化元数据的强大数据存储。
messages
或者,您的结构似乎在您的应用程序的控制中。如果这是真的,那么您不需要将所有内容存储为单个非规范化对象。相反,您可以将其作为规范化的一系列表存储到数据库中,这些表构成来自messages
. 看来您的所有数据都可以存储在关系数据库中。