首頁 > 科技週邊 > IT業界 > SQL vs nosql:如何選擇

SQL vs nosql:如何選擇

Jennifer Aniston
發布: 2025-02-19 10:03:10
原創
213 人瀏覽過

鑰匙要點

    SQL數據庫非常適合具有定義明確的,相關的數據要求以及數據完整性至關重要的項目。它們通常用於在線商店和銀行系統。 NOSQL數據庫更適合具有無關,不斷發展或不確定的數據要求的項目,而速度和可擴展性是關鍵的。它們通常用於社交網絡,客戶管理和Web分析系統。 NOSQL數據庫在數據存儲方面具有靈活性,允許隨意添加或刪除字段。他們將有關個人的所有數據存儲在單個文檔中,從而使數據檢索和全文搜索更加簡單。但是,他們沒有實施數據完整性規則或支持多個文檔的交易。
  • > SQL數據庫對於需要強大的數據完整性和交易支持(例如倉庫管理系統)是必需的。他們將相關數據存儲在表中,在使用之前需要一個模式,並支持表加入。但是,該模式是剛性的,數據可能會分散,這使開發人員或系統管理員檢查數據庫的具有挑戰性。
  • 在上一篇文章中,我們討論了SQL和NOSQL數據庫之間的主要差異。在此後續行動中,我們將把知識應用於特定方案,並確定最佳選擇。 回顧: SQL數據庫:
  • 在表中存儲相關數據
需要一個在使用
    之前定義表的架構
  • 鼓勵歸一化以減少數據冗餘
  • 支持表連接以從單個命令中的多個表中檢索相關數據
  • 實施數據完整性規則
  • 提供交易,以確保兩個或更多更新成功或失敗,因為原子單位
  • >
  • 可以縮放(一定的努力)
  • >
  • 使用強大的聲明語言來查詢
  • 提供大量的支持,專業知識和工具。
  • NOSQL數據庫:
  • 在類似JSON的名稱值文檔中存儲相關數據
  • 可以存儲數據而無需指定模式
    >通常必須將其義詞化,以便有關項目的信息包含在單個文檔中
  • 不需要加入(使用符合的文檔)
  • 允許隨時保存任何數據,而無需驗證
  • 保證對單個文檔的更新 - 但不能多個文檔
  • 提供出色的性能和可伸縮性
  • >使用JSON數據對象進行查詢
  • 是一項更新,令人興奮的技術。
SQL數據庫是可以確定需求並且魯棒數據完整性的項目的理想選擇。 NOSQL數據庫是不相關,不確定或不斷發展的數據要求的理想選擇,而速度和可擴展性更為重要。用更簡單的術語:
    SQL是數字的。它最適合具有確切規格的明確定義的離散項目。典型的用例是在線商店和銀行系統。
  • > NoSQL是類似物。它最適合具有流體需求的有機數據。典型的用例是社交網絡,客戶管理和Web分析系統。
  • 很少有項目完全合適。如果您擁有較淺或自然的數據規範化數據,則兩種選項都可可行。但是,請注意這些簡化的示例場景,並具有廣泛的概括!您比我更了解您的項目,而且我不建議您從SQL切換到NOSQL,反之亦然,除非它提供了相當大的好處。這是您的選擇。考慮項目開始時的利弊,您不會出錯。
  • 方案一:聯繫人列表
讓我們重新發明方向盤並實現基於SQL的地址簿系統。我們最初的幼稚接觸表由以下字段定義:

id
    >標題
  • > firstName
  • > lastname
  • 性別
  • >電話
  • 電子郵件
  • 地址1
  • 地址2
  • 地址3
  • 城市
  • 區域
  • > zipcode
  • 國家
  • 問題一:
  • 很少有人有一個電話號碼。我們可能至少需要三個土地線,移動和工作場所,但是我們分配多少人都不重要 - 某人,某個地方會想要更多。讓我們創建一個單獨的電話表,以便觸點可以隨心所欲。這也使我們的數據歸一化 - 我們不需要無數的聯繫人null:
contact_id 名稱
    (諸如土地線,移動工作等文本)
  • 數字
  • >問題二:我們在電子郵件地址遇到同樣的問題,因此讓我們創建一個類似的電子郵件表:
  • contact_id
名稱(諸如家庭電子郵件,工作電子郵件等文本) 地址
  • >問題三:
  • >我們可能不希望輸入(地理)地址,或者我們可能希望輸入多個工作,家庭,度假屋等多個地址。因此,我們需要一個新的地址表: contact_id
  • 名稱
  • (諸如家庭,辦公室等文本)
地址1 地址2
  • 地址3
  • 城市 區域
  • > zipcode
  • 國家
  • 我們的原始聯繫表已減少為:
  • id
  • >標題
  • > firstName
  • > lastname
  • 性別
太好了 - 我們有一個歸一化數據庫,可以存儲任何數量的電話號碼,電子郵件地址和地址。很遺憾 … 模式很嚴格 我們沒有考慮聯繫人的中間名,出生日期,公司或工作角色。我們添加了多少個字段都沒關係,我們很快會收到有關票據,週年紀念日,關係狀態,社交媒體帳戶,內部腿部測量,喜歡的奶酪類型等的更新請求。 d可能會創建一個帶有名稱對對應對的其他數據表。 數據分散 開發人員或系統管理員檢查數據庫並不容易。程序邏輯也將變得越來越慢,更複雜,因為在具有多個JOIN條款的單個選擇語句中檢索聯繫人的數據是不切實際的。 (您可以,但結果將包含電話,電子郵件和地址的每種組合:如果有人有三個電話號碼,五個電子郵件和兩個地址,則SQL查詢將產生30個結果。) 最後,很難進行全文搜索。如果有人輸入字符串“ sitepoint”,我們必須檢查所有四個表是否是聯繫人名稱,電話,電子郵件或地址的一部分,並相應地對結果進行排名。如果您曾經使用過WordPress的搜索,您將了解可能會令人沮喪。 NOSQL替代 我們的聯繫數據涉及人們。它們是不可預測的,並且在不同時間有不同的要求。聯繫人列表將受益於使用NOSQL數據庫,該數據庫存儲在聯繫人集合中的單個文檔中:

在此示例中,我們尚未存儲聯繫人的標題或性別,並且添加了不需要適用於其他任何人的數據。沒關係 - 我們的NOSQL數據庫不會介意,我們可以隨意添加或刪除字段。 由於聯繫人的數據包含在單個文檔中,因此我們可以使用單個查詢來檢索一些或所有信息。全文搜索也更簡單;在MongoDB中,我們可以在所有觸點上定義一個索引 文本字段使用:

然後使用以下方式執行全文搜索
<span>{
</span>  <span>name: [
</span>    <span>"Billy", "Bob", "Jones"
</span>  <span>],
</span>  <span>company: "Fake Goods Corp",
</span>  <span>jobtitle: "Vice President of Data Management",
</span>  <span>telephone: {
</span>    <span>home: "0123456789",
</span>    <span>mobile: "9876543210",
</span>    <span>work: "2244668800"
</span>  <span>},
</span>  <span>email: {
</span>    <span>personal: "bob@myhomeemail.net",
</span>    <span>work: "bob@myworkemail.com"
</span>  <span>},
</span>  <span>address: {
</span>    <span>home: {
</span>      <span>line1: "10 Non-Existent Street",
</span>      <span>city: "Nowhere",
</span>      <span>country: "Australia"
</span>    <span>}
</span>  <span>},
</span>  <span>birthdate: <span>ISODate</span>("1980-01-01T00:00:00.000Z"),
</span>  <span>twitter: '@bobsfakeaccount',
</span>  <span>note: "Don't trust this guy",
</span>  <span>weight: "200lb",
</span>  <span>photo: "52e86ad749e0b817d25c8892.jpg"
</span><span>}</span>
登入後複製
登入後複製
db<span>.contact.createIndex({ "$**": "text" });</span>
登入後複製
方案二:社交網絡
db<span>.contact.find({
</span>  <span>$text: { $search: "something" }
</span><span>});</span>
登入後複製
社交網絡可以使用類似的聯繫數據存儲,但它在功能集上擴展了與關係鏈接,狀態更新,消息傳遞和“喜歡”之類的選項。這些設施可以通過用戶需求來實施並放棄 - 不可能預測它們將如何發展。 此外:

大多數數據更新都有一個原始點:用戶。我們不太可能一次更新兩個或多個記錄,因此不需要類似於交易的功能。
    >
  • 儘管有些用戶可能會想到,但狀態更新失敗不太可能導致全球崩潰或財務損失。該應用程序的界面和性能比強大的數據完整性更高。
  • NOSQL似乎很合適。該數據庫允許我們快速實施存儲不同類型數據的功能。例如,所有用戶的日期狀態更新都可以放在狀態集合中的單個文檔中:
儘管該文檔可能會很長,但我們可以獲取數組的一個子集,例如最新更新。也可以快速搜索每個用戶的整個狀態歷史記錄。 現在,假設我們在發布更新時想引入表情符號選擇。這將是對更新數組中的新條目添加圖形引用的問題。與SQL商店不同,無需將以前的消息情緒設置為NULL - 如果未設置表情符號,我們的程序邏輯可以顯示默認值或沒有圖像。
<span>{
</span>  <span>name: [
</span>    <span>"Billy", "Bob", "Jones"
</span>  <span>],
</span>  <span>company: "Fake Goods Corp",
</span>  <span>jobtitle: "Vice President of Data Management",
</span>  <span>telephone: {
</span>    <span>home: "0123456789",
</span>    <span>mobile: "9876543210",
</span>    <span>work: "2244668800"
</span>  <span>},
</span>  <span>email: {
</span>    <span>personal: "bob@myhomeemail.net",
</span>    <span>work: "bob@myworkemail.com"
</span>  <span>},
</span>  <span>address: {
</span>    <span>home: {
</span>      <span>line1: "10 Non-Existent Street",
</span>      <span>city: "Nowhere",
</span>      <span>country: "Australia"
</span>    <span>}
</span>  <span>},
</span>  <span>birthdate: <span>ISODate</span>("1980-01-01T00:00:00.000Z"),
</span>  <span>twitter: '@bobsfakeaccount',
</span>  <span>note: "Don't trust this guy",
</span>  <span>weight: "200lb",
</span>  <span>photo: "52e86ad749e0b817d25c8892.jpg"
</span><span>}</span>
登入後複製
登入後複製
方案三:倉庫管理系統

考慮一個監視倉庫商品的系統。我們需要記錄:

    >到達倉庫並分配給特定位置/海灣
  • 的產品
  • 倉庫內的貨物運動,例如重新安排庫存,因此相同的產品在相鄰的位置
  • 訂單和隨後從倉庫中刪除產品以進行交付。
  • 我們的數據要求:
  • 可以存儲
通用產品信息,例如盒子數量,尺寸和顏色,但是我們可以識別並應用於任何東西的離散數據。我們不太可能關注細節,例如筆記本電腦處理器速度或估計的智能手機電池壽命。
    >必須最大程度地減少錯誤。我們不能讓產品消失或移至已經存儲不同產品的位置。
  1. >
  2. 以最簡單的形式,我們正在記錄項目從一個物理區域到另一個物理區域的轉移 - 或從位置A刪除並放置位置B。這是相同動作的兩個更新。
我們需要一個具有強大的數據完整性和交易支持的強大商店。只有SQL數據庫(當前)才能滿足這些要求。

揭露自己!

我希望這些方案有所幫助,但是每個項目都不同,最終您需要做出自己的決定。 (儘管我們的開發人員都擅長證明我們的技術選擇,而不管他們有多好!)) 最佳建議:使自己了解盡可能多的技術。這些知識將使您對SQL或NOSQL做出理性和情感公正的判斷。祝您好運。

經常詢問有關SQL vs nosql

的問題(常見問題解答)

> SQL和NOSQL數據庫之間的關鍵差異是什麼?

sql和NOSQL數據庫在幾種方面有所不同。 SQL數據庫是關係的,這意味著它們在表和行中組織了數據。他們使用結構化查詢語言(SQL)來定義和操縱數據。另一方面,NOSQL數據庫是非依賴的,可以以幾種方式存儲數據:基於文檔的,基於列,基於圖形或鍵值對。它們對於使用大量分佈式數據特別有用。

>我何時應該在nosql?

sql數據庫上使用SQL,當您具有清晰的架構並且數據完整性為時是一個不錯的選擇最重要的。當您需要執行複雜的查詢時,它們也很有益。 SQL數據庫是酸性的,可確保可靠的交易。

>

何時NOSQL比SQL?

nosql數據庫是一個更好的選擇。隨著時間的流逝不清楚或變化。它們提供了靈活性,可伸縮性和速度,使其成為實時應用程序和大數據的理想選擇。

可以在同一項目中進行SQL和NOSQL共存嗎?可以在同一項目中共存。這被稱為多語言持久性體系結構。數據庫的選擇取決於您應用程序每個部分的特定要求。

>

有哪些流行的SQL和NOSQL數據庫?

流行的SQL數據庫包括MySQL,Oracle和PostgreSQL。流行的NOSQL數據庫包括MongoDB,Cassandra和Redis。桌子和關係。在NOSQL數據庫中,可以根據NOSQL數據庫的類型進行多種方式進行數據建模:文檔,鍵值,列或圖形。 > sql數據庫通常通過添加更強大的硬件來垂直擴展,而NOSQL數據庫通過添加更多服務器來處理更多的服務器來縮放流量。

什麼是CAP定理,它如何適用於SQL和NOSQL?

cap定理指出,分佈式數據存儲不可能同時提供以下三個保證中的兩個以上的保證:一致性,可用性,可用性,可用性和分區耐受性。 SQL數據庫優先級一致性和可用性,而NOSQL數據庫優先考慮可用性和分區耐受性。

>

> sql和nosql如何處理交易?

用於交易。另一方面,NOSQL數據庫通常不提供所有酸性。取而代之的是,他們專注於基礎(基本上可用,柔軟的狀態,最終是一致)。行交易,例如會計系統或需要復雜查詢的系統。 NOSQL數據庫非常適合需要處理大量數據並水平擴展的應用程序,例如內容管理系統,實時分析和IoT應用程序。

以上是SQL vs nosql:如何選擇的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板