PostgreSQL 和 MongoDB 的聊天模式
我正在為一個非常大的聊天應用程序設計一個模式。我在使用 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
. 看來您的所有數據都可以儲存在關係數據庫中。