2011-04-05 86 views
0

我試圖建立一個數據表結構,最好支持以下標準:爲未知數量的列設計數據表的最佳方法是什麼?

1)我不知道表有多少列。

  • 我在某些情況下可能需要6列,或在其他情況下需要10列。我不認爲這張桌子需要20列或更多列,但我也不能保證永遠不會需要。

2)我需要考慮存儲空間和報告速度。

  • 此表需要存儲數百萬條記錄,並且報表將針對此表運行。我知道擺脫高度規範化的表格從報告的角度來看很困難,所以我想解除報告的規範化。但是,我也不知道是否爲了避免一些規範化而簡單地違約到大量的列是一個好主意,因爲我可能會在表的末尾的許多列中結束大量的NULLS,那些將(我認爲)都佔用了一些存儲空間。

3)如果我必須在存儲空間和報表性能之間進行選擇,我會在性能方面表現出色。我不是一個商業智能專家,我不是一個T-SQL專家(我將使用SQL Server),所以我很確定在這裏有很好的一點,我只是忽略了它。因此,我再次轉向了精彩的SO社區尋求建議,並且讓我的頭骨有一些感覺。

在這種情況下你會如何設計表格?我錯過了什麼細節,仍然需要考慮?

+0

除了簡單提及困難的旋轉之外,是否有一個原因,您是否迴避了'product_property'和'product_property_value'表集? – 2011-04-05 20:40:59

+0

凱文 - 不要product_property和product_property_value有它自己的問題?所有東西(日期,數字)都應該作爲字符串存儲,約束難以實現,當然,即使是非常基本的「選擇」查詢,也是如此。 – 2011-04-05 21:07:48

+0

我對這些事情的理解是有限的,但是由於Rajesh引用的理由,我對此不甚瞭解。 – campbelt 2011-04-05 22:02:17

回答

2

大多數通用表設計的列值根據用戶設置決定/如此將導致性能較差,因爲所有查詢都是動態的。

合理的做法是提出對列數的估計,並讓未使用的列最初爲空。

你能舉個例子說明你的故事是什麼嗎?引發這個問題的一個例子是當你有一個產品表時,有些產品只有5個屬性,有些產品有50個。正如我上面所說的,你最好用50列創建表(如果你想有一個產品表),並在需要時將其他列作爲null。

報告工具和大多數RDBMS在聚合和分組過程中處理空值。

+0

Rajesh,你已經完全理解了我的問題。實際上,我將爲具有一些未知屬性的產品構建這些表格。有些產品有6個屬性,其他產品可能有10個。雖然,我沒有看到數量超過10個。因此,我在考慮拖欠20美分,但不確定這是否是正確的選擇,或者我是否過分簡化了問題。最重要的是,我想知道我沒有考慮到:) – campbelt 2011-04-05 20:21:29

5

表中的列表示要存儲的實體的規格。說你不知道有多少列將被存儲意味着你不知道要存儲的東西的規格。換句話說,你想建立一個系統而不知道它會存儲什麼。關係數據庫基本上沒有設計成處理這個並且性能良好且可維護。爲了表現良好且可維護,關係數據庫依賴花費時間來確定要存儲的實體的屬性及其屬性,然後構建適當的模式。

因此,使用關係數據庫的最佳性能和最可維護的解決方案是根據需要構建模式,這意味着需要收集有關要存儲的規格。

也就是說,關係數據庫有其他選擇,比如所謂的「nosql」數據庫,它可能比關係數據庫更適合超級彈性設計的需要。這些示例包括MongoDB和CouchDB。

+0

謝謝托馬斯。我不得不懷疑,當你真的不知道需要多少列時,你做了什麼,而且沒有辦法知道?我的意思是,我可以決定,我可能永遠不會需要更多的X列,但我正在建立這些表來存儲未知數量的產品,每個產品都帶有未知數量的屬性來存儲... – campbelt 2011-04-05 22:05:15

+0

@campbelt - 關係數據庫中的表格不是用來存儲一組任意的東西。例如,你希望存儲汽車的結構與你想要存儲筆記本電腦,服裝,核潛艇或電影剪輯的結構不同。是否可能*在RDBMS中創建一個結構來存儲沒有模式的「事物」?當然,但它不會很好,也不可維護,如果報告和性能(和規模)很重要,那麼RDBMS不是正確的工具。這與使用Excel編寫書籍類似。 – Thomas 2011-04-05 22:28:02

+0

@campbelt - 鑑於上述情況,如果相反這個附加數據的規格是它將是一個任意的數據的數據,將永遠不會被查詢,分析,用於數學計算,過濾,排序或任何使用的方式除了吐出每個產品的全部內容來報告之外,還有解決方案。然而,這些解決方案都需要遵守紀律,不要像標準列那樣處理這些數據,而應該像一堆筆記。 – Thomas 2011-04-05 22:31:24

相關問題