我們的案例是否適合 NoSQL 數據庫解決方案?
我們目前正在執行一個查詢 SQL MariaDB(通過 SQLAlchemy)的 Python Web 應用程序。不幸的是,我們遇到了 MariaDB 的一些硬性限制(連接數限制為 61),並且正在尋找替代方案。我們的數據庫不是很大(通常小於 2GB 並且增長緩慢),條目實際上可以很好地分解為簡單的 json 對象,這讓我們看到了 NoSQL 解決方案。
最初,這似乎是一個很好的解決方案。查詢非常快(因為數據庫適合 RAM),我們很高興(幾天)。
**不過,如果 NoSQL DB 是滿足我們需求的推薦解決方案,我來這裡尋求建議。**那麼讓我們談談數據:
我們數據的本質是多組條目/行通常引用回同一個對象,就像您有多個與單個對象相關的版本一樣。
假設文件條目可能如下所示:
_id: 5a31... description: Object location: "XYZ" name: "ABC" status: "A" m_nr: null k_nr: null city: "QWE" high_value: 17 right_value: 71 more_data: Object number: 101 interval: 1 next_date: "2016-01-16T00:00:00Z" last_date: null status: null classification: Object priority_value: "?" redundancy_value: "?" active_value: "0"
想像一下,
description.location
遺囑經常需要進行分組和排序,以便我只能顯示$last
每個分組條目的條目。一個常見的查詢可能如下所示(inMongoDB
):db.getCollection('a').aggregate( [{ $sort: {"description.location": 1} }, { $group: {_id: "$description.location"} }] )
不幸的是,我發現這個特定的查詢需要很長時間,當數據庫不適合記憶體時——即使在 MongoDB中存在索引。
description.location
(由於某種原因,$group
聚合操作似乎從未使用可用索引,而$sort
實際上確實使用了它)。無論哪種方式,這種數據/佈局/查詢策略是否與 NoSQL DB 產生了很好的共鳴?
我看到您對 JSON 對象的興趣。
我們的數據庫不是很大(通常小於 2GB 並且增長緩慢),條目實際上可以很好地分解為 簡單的 json 對象,這讓我們看到了 NoSQL 解決方案。
MongoDB更適合大型數據庫,在您的情況下,我建議 PostgreSQL。
您可以在 PostgreSQL 中使用 JSON 類型:https ://www.postgresql.org/docs/current/static/datatype-json.html
將您的應用程序遷移到 PostgreSQL 應該很容易,因為它一直是 SQL,我懷疑您會發現那個愚蠢的連接限制。
無論哪種方式,這種數據/佈局/查詢策略是否與 NoSQL DB 產生了很好的共鳴?
使用 NoSQL 時性能是有代價的,很多時候,您將不得不修改您的程式碼、您的數據庫架構、您的伺服器配置。你準備好付出代價了嗎?
回答你的問題,我盡量避免 MongoDB 聚合,更喜歡在現場手動聚合(我的原始碼是我的 SQL),但我這樣做是針對小範圍的。如果做整個表/集合,最好使用 Map-Reduce 或 Aggregation 或自定義程式碼?這取決於,誰做得更快?
大多數時候,人們會建議對您的數據進行非規範化處理,但這樣做可能會導致其他一系列問題。再次,付出代價。