Database-Design

如何處理具有可變列的表格設計

  • April 4, 2014

我有一個表設計方案,並且作為非 DBA 類型,想知道哪個更具可擴展性。

假設您被要求記錄一個都市區的房屋資訊,從一個小社區(200 所房屋)開始,但最終增長到 5000000 多所房屋。

您需要儲存基本資訊:ID#(我們可以用作唯一索引的唯一批次#)、Addr、City、State、Zip。好的,簡單的表將處理它。

但是每年,您都會被要求記錄有關所有房屋的額外資訊 - 以及每年會更改哪些資訊。因此,例如,第一年,您被要求記錄所有者的姓氏和平方英尺。第二年,您被要求保留姓氏,但丟棄平方英尺並開始收集所有者的名字。

最後 - 每年額外的列數都會改變。可能會從 2 個額外的列開始,然後明年增加到 6 個,然後再降到 2 個。

因此,一種表格方法是嘗試將自定義資訊添加為房屋表格中的列,因此只有一張表格。

但是我有一種情況,有人為此列出了表格:

“House Table”列:ID、Addr、City、State、Zip - 每間房子一行

ID   Addr              City     State  Zip 
-------------------------------------------
1    10 Maple Street   Boston      MA  11203

2    144 South Street  Chelmsford  MA  11304

3    1 Main Avenue     Lowell      MA  11280

“自定義資訊表”列:ID、名稱、值 - 表看起來像:

ID   Name             Value

1    Last Name        Smith

2    Last Name        Harrison

3    Last Name        Markey

1    Square Footage   1200

2    Square Footage   1930

3    Square Footage 

因此,每個單獨的房屋記錄都有多行。每年所需的可選資訊發生變化時,此表都會重新建構,因此明年它可能如下所示:

1    Last Name    Smith

2    Last Name    Harrison

3    Last Name    Markey

1    First Name   John

2    First Name   Harry

3    First Name   Jim

最終你積累了 100,000 行房屋,一年有 10 條額外的資訊;第二個表現在有 1,000,000 行資訊,其中許多具有冗餘(描述)資訊。總體而言,數據庫要求是人們每天需要數千次獲取房屋行資訊 + 相關的自定義欄位值。

所以我的問題是:改為:

A)佈局房屋表,猜測最大自定義列數(可能稱為“1”到“10”)並將這些自定義值插入房屋行

要麼

B)將自定義資訊儲存在房屋表中,但是每年當需求發生變化時,僅使用自定義資訊所需的列數重建房屋表,其想法是要求可能會發瘋,而您永遠不知道最多有多少可能會要求可選欄位?

謝謝,希望這是有道理的!

你幾乎有4個選擇:

NoSQL -定義每條記錄都儲存為一組鍵/值對。它非常靈活和快速。並非所有的報告編寫者都支持這種儲存方式。NoSQL 有許多範例數據庫實現。現在似乎最流行的一個是 MongoDB。

EAV -定義這是您將整個表或部分(在另一個表中)翻轉的位置。如果您內部已經有一個無法輕易擺脫的關係數據庫,那麼這是一個不錯的選擇。您提供的自定義資訊表範例是 EAV 表的一個很好的範例。

帶有 XML 列的標準表- 可以將其視為 NoSQL 遇到關係表。儲存在 XML 列中的數據可以是 XML 支持的任何格式,包括多個相關的子數據。對於您知道將成為“正常”列的列,可以將它們建構為適當類型的列來儲存數據(姓氏、地址、城市、州等)。

具有大量額外的標準表- 您有一個關係數據庫,您不能使用 XML 或 EAV,並且 NoSQL 不是一個選項。添加大量每種類型的額外列。我猜 30 個或更多 varchar、30 個或更多整數、15 個或更多數字。並且一旦您使用一列作為值,就不要重複使用它。也不要刪除該列

在所有這些解決方案中,我個人的看法是,您會發現 NoSQL 或 EAV 方法是最成功的,並且重構程式碼和架構的量最少。

您將遇到這樣一種情況,即您在一年而不是下一年收集數據,然後再收集數據。試圖用正確的資訊更新舊數據是有問題且昂貴的。儲存既不是。

要回答你關於這兩個選項的問題,我覺得都不對。A) 會把你鎖在裡面,B) 工作量很大。您描述的目前架構還不錯(除了將資訊名稱(“名字”、“平方英尺”等)作為字元串而不是引用到查找表的 ID 之外。

但是,在我看來,這似乎是 NoSQL 數據庫 ( http://en.wikipedia.org/wiki/NoSQL ) 的一個很好的候選者。雖然我從未使用過這樣的數據庫,但您所描述的是一個可以解決的典型場景。

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