Database-Design

具有許多屬性的數據建模,其中很少適用於每條記錄

  • July 11, 2014

我對數據建模很陌生,所以如果我錯過了一些明顯的東西,請原諒。我正在嘗試決定一個模式(或者可能是一個 DBMS)來處理一些數據,其中有很多可能的屬性(可能是 60-100 個),但只有少數屬性適用於每條記錄。這是我看到的選項。

選項 1:非常寬的桌子

只需將每個屬性包含為列,對於任何給定記錄,大多數屬性都將為 NULL。

**優點:**保持模式簡單,保持查詢簡單

**缺點:**不優雅、笨拙、添加/刪除屬性需要更改架構

選項 2:實體-屬性-價值模型

用於列出屬性及其值的單獨表。這就是我以前看到這個問題的處理方式。例如,WordPress 在他們的*meta表格中使用類似的東西。

**優點:**概念上易於理解,靈活

**缺點:**查詢構造變得很痛苦,性能受到影響,最終會產生大量重複數據(即一遍又一遍地列出相同的屬性名稱)。

選項 3:NoSQL 文件或圖形 DBMS

使用為處理無模式數據而建構的 DBMS。我看過 MongoDB、RethinkDB 和 OrientDB。OrientDB 看起來很酷,但我不懂 Java,而且它似乎主要是 Java 的東西(例如,PHP 驅動程序看起來有問題)。

**優點:**專為處理靈活的模式而設計,速度快

**缺點:**關係似乎很困難,我對它們沒有經驗,似乎有很多重複數據(例如,如果我想更改屬性的名稱會發生什麼?),查詢似乎更複雜

附帶說明一下,此應用程序不會獲得太多流量,並且並發連接數也很少。因此,可擴展性是一個相當次要的問題。感謝您的任何建議。

選項 4:類表繼承

這是一種用於實現類/子類情況的設計技術。在這種情況下,屬性通常只適用於一個子類,而不適用於表中的所有行。訪問SO 中的同名標籤以查看一堆相關問題和答案。

這樣做的好處是消除了 NULLS(大部分情況下),提供了快速簡便的連接,並執行了類:子類關係的 1:1 網路。

您的選項 1 有時稱為“單表繼承”

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