阿瓦什·米特拉
日·8 分鐘閱讀
NoSQL指的是非關聯式 SQL或非唯一 SQL。它允許用戶儲存和檢索以表格關係以外的方式建模的資料。
由於資料庫架構很靈活,因此存在不同類型的 NoSQL 資料庫。其中一些是:
鍵值 NoSQL 資料庫:
它將資料儲存為鍵值對的集合,其中鍵充當唯一識別碼。每個值可以有不同的模式。它的範圍可以從簡單的物件到複雜的物件。
是一些流行的鍵值 NoSQL 資料庫。
文件NoSQL資料庫:
在文件NoSQL資料庫中,它不是以表格形式儲存數據,而是將物件及其所有元資料儲存在文件中。每個文件將資料儲存在欄位值對中。每個文件可以根據需要有不同的架構。
文件可以以 JSON、XML 等格式儲存。
是少數文檔 NoSQL 資料庫。
圖 NoSQL 資料庫:
在圖資料庫中,節點用於儲存數據,邊用於定義這些實體之間的邊。
Neo4j、Nebula Graph是一些圖 NoSQL 資料庫。
NoSQL 資料庫相對於 SQL 資料庫的優勢。
在 NoSQL 資料庫中,整個物件及其元資料儲存在單一文件中。因此,如果我們想要所有相關數據,那麼我們只需獲取該文件即可。然而,在 SQL 資料庫中,指標必須依序讀取所有值(針對該行)。另外,如果另一個關係引用當前關係,那麼我們可能需要一個連結(這是昂貴的)。因此,在NoSQL資料庫的情況下,資料檢索速度更快。
對於插入,我們通常會收集一個物件的所有元數據,然後插入它(就像我們收集所有屬性的值然後插入該行一樣)。由於文件包含物件的所有數據,我們只需要新增一個文件。因此,在 NoSQL 資料庫中插入速度更快。
例如,當我們向資料庫新增使用者時,我們不會儲存姓名和年齡,而是將其餘詳細資訊留到以後使用。我們嘗試收集盡可能多的數據。同樣,如果我們需要顯示用戶個人資料,我們需要所有相關數據。
靈活性
NoSQL 資料庫提供靈活的模式。我們可以向某些文件添加某些字段,而忽略其餘字段。
例如,對於有中間名的用戶,我們可以有一個名為middle_name的字段,而對於只有名字和姓氏的用戶,我們可以忽略它。
SQL 資料庫不提供這種靈活性。我們可以為所有使用者新增一個欄位(我們所說的欄位是指屬性),也可以不新增任何新欄位。
考慮上面的範例,我們必須新增一個名為middle_name的新屬性。僅具有名字和姓氏的使用者會將此屬性設為 NULL。
此外,如果我們添加一個不僅僅用於新插入所需的字段,我們可以在 NoSQL 資料庫中輕鬆完成。然而,對於 SQL 資料庫來說,這是一個非常昂貴的操作(因為我們需要鎖來確保資料一致性)。
可擴充性和可用性
NoSQL 資料庫通常會放 業主資料庫 寬關聯式資料庫的一些 ACID 屬性以進行水平擴展。 NoSQL 資料庫還具有內建的水平分區。 NoSQL 資料庫也犧牲一致性來提供可用性。
因此,與 SQL 資料庫相比,NoSQL 資料庫通常提供更高的可擴充性和可用性
NoSQL 資料庫專為資料聚合/分析而構建
SQL 相對於 NoSQL 資料庫的優勢。
數據更新
NoSQL 資料庫本質上不支援更新。如果我們想要更新字段,我們必須刪除文檔或鍵值對,並添加包含更新字段的新文檔。
對於 SQL 資料庫,更新值要簡單得多。
所以,當我們更新頻繁的時候,NoSQL資料庫就不適合了。
交易
正如我們之前討論的,NoSQL 資料庫為了可擴展性而放寬了一些 ACID 屬性,這意味著 如何成為電子郵件行銷人員 我們不能在 NoSQL 資料庫中進行事務(這就是金融系統不使用 NoSQL 資料庫的原因)。
加入
在 NoSQL 資料庫中連接要困難得多。要連接兩個 NoSQL 表,我們必須遍歷每個資料區塊,找到連接所需的相關字段,然後合併兩個表。所以我們可以說,對於 NoSQL 資料庫來說,聯結是手動的。
相比之下,SQL 資料庫是為連接而建構的。
對於 NoSQL 資料庫來說,關係不是隱含的
現在我們知道了 SQL 和 NoSQL 資料庫的優點,讓我們討論一個名為Cassandra的流行NoSQL資料庫的工作原理。
卡桑德拉是什麼?
Cassandra 是一個免費、開 中國資料庫 源、分散式的 NoSQL 資料庫系統。
卡桑德拉如何工作?
- 假設我們有一個包含 5 個節點的分散式 Cassandra 叢集。
- 我們有一個雜湊函數,可以產生 0 到 499 之間的均勻隨機值。
- 從 0 到 99 的請求將路由到節點 0。
跨節點分配負載
由於有 5 個節點,並且我們的雜湊函數會產生均勻的隨機金鑰,因此可以安全地假設負載均勻分佈。
現在讓我們假設特定節點(假設為 3 個)上的負載增加(可能是由於雜湊函數錯誤或我們從相同 ID 收到大量請求等)
為了解決這個問題,我們可以再增加層叢集。
在我們的例子中,我們將向節點 3 新增另一個叢集。我們可以使用另一個雜湊函數來分配負載。
根據需要,我們可以擁有多個層級的叢集。
避免資料遺失
一旦我們將資料保存在特定節點中,我們就不想失去它。即使該節點崩潰了。為了避免資料遺失,我們可以將資料副本儲存在另一個節點上(選擇下一個節點來儲存資料)。
現在,當我們進行查詢時,我們會檢查所需節點及其下一個節點中的資料。如果我們有 2 個副本,那麼我們只需要檢查下一個節點。如果我們有 3 個副本,我們將檢查接下來的 2 個節點。
它還為我們提供了以下功能:
- 負載平衡
- 快速讀取查詢的冗餘
- 複製保證數據
法定人數
一份資料儲存在多個節點中。因此,我們需要某種機制,以便節點就特定的回傳值達成協議。
需要法定人數
讓我們舉個例子,
- 假設我們將資料複製到 3 個節點上。節點 0,1 和 2。
- 我們向節點0發出寫入請求。
- 同時,我們有一個對新插入資料的讀取請求,但節點 0 失敗。
- 由於節點 0 失敗,它會檢查節點 1 和 2。
- 因此我們的資料庫發送了一個錯誤的資料未找到錯誤。
- 相反,資料庫應該發送資料庫錯誤。
為了避免此類問題,我們需要分散式共識,而實現這一點的一種方法是透過 Quorum。
法定人數如何運作?
在仲裁中,如果特定數量的節點(稱為仲裁因子)就特定值達成一致,則該值將被發回。
如果我們在多個節點上有數據,那麼我們會獲取具有最新時間戳的數據(時間戳只是一個因素。您可以根據您的用例選擇任何因素)。因此,即使我們的節點之一發生故障,用戶仍然可以讀取資料。
quorum是否能保證回傳值永遠正確?不。
僅考慮上面的例子。假設我們的仲裁因子為 2。
如果我們的 Quorum 因子為 3,那麼查詢將會失敗。
因此,低仲裁因子以一致性為代價提供了更高的可用性,而高仲裁因子提供了更高的一致性,但使系統的可用性降低。