什麼是 NoSQL 資料庫?

阿瓦什·米特拉

日·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,那麼查詢將會失敗。

因此,低仲裁因子以一致性為代價提供了更高的可用性,而高仲裁因子提供了更高的一致性,但使系統的可用性降低。

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端