Database-Design

數據庫分區 - 水平和垂直分片 - 規範化和行拆分之間的區別?

  • April 1, 2021

我試圖掌握數據庫分區的不同概念,這就是我對它的理解:

水平分區/分片:將表拆分為不同的表,這些表將包含初始表中行的子集(如果按大陸拆分使用者表,我已經看到了很多範例,例如北美的子表,另一個用於歐洲等…)。每個分區位於不同的物理位置(了解“機器”)。據我了解,水平分區和分片是完全相同的東西(?)。

垂直分區:據我了解(http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx),有兩種垂直分區:

  • 規範化(包括通過拆分錶並將它們與外鍵連結來從數據庫中刪除冗餘)。
  • Row Splitting,這裡是我不明白的地方,Normalization 和 Row Splitting 有什麼區別?這兩種技術有什麼不同?

我還在這篇文章(https://stackoverflow.com/questions/11707879/difference-between-scaling-horizo ​​ntally-and-vertically-for-databases )中讀到水平分區和垂直分區之間的區別在於第一個您通過添加更多機器來擴展,而在第二台中,您通過向現有機器添加更多功率(CPU、RAM)來擴展,這是一個正確的定義嗎?我認為這兩種技術之間的核心區別在於拆分錶格的方式。根據 MongoDB 對垂直分區的定義,這個答案確實有意義:http: //docs.mongodb.org/manual/core/sharding-introduction/

但這與我遇到的其他答案或文章相矛盾:

https://stackoverflow.com/questions/18302773/what-are-horizontal-and-vertical-partitions-in-database-and-what-is-the-differen http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx http://building.wanelo.com/post/42361472646/the-case-for-vertical-sharding

對於這麼多問題,我感到很抱歉,但我有點困惑,因為我遇到的許多不同網站都說了不同的話。

任何幫助澄清將不勝感激。任何指向帶有幾個表格的清晰簡單展示的連結也將非常有幫助。

儘管規範化和分區都會對錶之間的列進行重新排列,但它們的用途卻截然不同。

在邏輯數據模型設計期間首先考慮規範化。它是一組規則,可確保每個實體類型都具有明確定義的主鍵,並且每個非鍵屬性單獨且完全依賴於該主鍵。

分區在物理數據庫設計期間出現,當我們開始將邏輯屬性映射到物理列並確定係統所需的操​​作特徵時。有時它是在負載測試後添加的優化,因為發現性能不足。它還可以在實施數據保留策略方面發揮作用。

在分區中,我們認識到表是由行和列組成的。當我們分區時,我們將其中一些行(或列)與其他行(或列)分開,並將它們保存在物理上不同的位置。

水平分區是指一些行儲存在一個表中,而一些行儲存在另一個表中。可能有很多子表。一個典型的例子是目前活動的事務數據與舊的“歸檔”數據分離。這使“熱”數據保持緊湊,並具有相關的性能改進。我們很多人也可以將存檔表設置為只讀、壓縮和在更便宜的磁碟上。

作為下一步,每個分區可以移動到單獨的硬體上。這通常稱為“分片”。優點包括能夠使用許多更便宜的盒子而不是一台非常大、非常昂貴的伺服器,並且能夠將使用者的數據定位在地理上靠近她的位置。代價是增加了應用程序的複雜性。一些 DBMS 本身就包含了這種能力。

垂直分區是將某些列移動到不同的表或表時。與水平分區類似,動機是保持“熱”表較小,以便訪問更快。假設您經營一家電子行銷公司。99% 的時間你只需要一個人的姓名和電子郵件地址,別無其他。這些將放在一張桌子上,而所有其他有用但很少使用的東西 - 生日,高爾夫差點,PA的電話號碼等 - 放在另一張桌子上。當分區具有不同的更新制度或由不同的業務部門擁有時,它也可以提供幫助。兩個表可以有相同的主鍵列,對應的行可以有相同的鍵值。雖然一個表可以有多個垂直分區,並且可以垂直分片,但我從來沒有遇到過。

垂直和水平分區可以混合使用。可以選擇將所有已關閉的訂單保存在一個表中,而將打開的訂單保存在單獨的表中,即兩個水平分區。對於未結訂單,訂單數據可能在一個垂直分區中,而履行數據則在單獨的分區中。

我談到的技術是改變設計以提高性能的方法。縮放是當您更改硬體時。一個人可以通過購買更大的機器來擴大規模,配備更多的 RAM、CPU 或更快的磁碟,或者通過將一些工作轉移到不同的機器上來擴大規模。放大有時稱為垂直縮放,而向外擴展可以稱為水平縮放。雖然水平縮放和分片有明顯的關係,但它們並不是同義詞。可以使用複制技術將整個數據庫複製到另一個位置供那裡的使用者使用,從而實現橫向擴展,而無需對任何表進行分區。

我不確定您所說的“行拆分”是什麼意思。您的意思可能與通常所說的“表分解”相同。這涉及將一個表分解為兩個表。它們通常具有不同的主鍵並且通常具有不同的行數。原始表中的每一列都放在一個表中。此外,在一個表中添加了一個額外的列,用作對另一個表的主鍵的外鍵引用。

分解與正規化有什麼關係?井正規化經典地是指遵守對某些眾所周知的範式的限制。這些範式稱為:

  • 第一範式
  • 第二範式
  • 第三範式
  • Boyce-Codd 範式
  • 第四範式
  • 第五範式。

您可能會看到提到的另外兩種形式是第六範式和域鍵範式

通常,當您分析表系統並確定它偏離這些範式之一時,您可以通過分解表來獲得一致性,其中特定分解在教程中針對該範式進行了描述。

符合每個標準形式都有好處和缺點。您需要學習如何規範化數據以及何時不規範化。

分解表是對數據邏輯模型的轉換。任何查看表結構的人都可以看到它。

分區表通常是指在數據表中發生的拆分,但該表仍被定義為一個表。在某些磁碟上放置某些行可能有點像您在問題中引用的範例。

這是轉換數據的物理模型而不是數據的邏輯模型的拆分。這種拆分對於查看表系統結構但不查看每個表內部的人來說是透明的。

分區通常是為了速度而進行的。

規範化通常是為了消除某些類型的更新異常,從而使正確管理數據更容易一些。它確實對速度有積極和消極的影響。

引用自:https://dba.stackexchange.com/questions/54479