我有一個非常寬的表非規範化的(如果你能說)這樣的,選項欄去100+如何對這個SQL Server表進行非規範化處理?
Year ProductID ProductName Option1 Option2 Option3 ....Option100
-----------------------------------------------------------------
2016 1 Test1 A1 A1a A3
2015 1 Test1 A1 A2 A2a
問題是我們有動態查詢試圖確定選項列,然後找到期權價值在他們
即
@SQL= 'SELECT Option' + @getOptionNum +' FROM ProductMapping
理想我希望這轉化爲這樣的事情
Year ProductID ProductName OptionName
-------------------------------------
2016 1 Test1 Option1
2016 1 Test1 Option2
2016 1 Test1 Option3
2015 1 Test1 Option1
2015 1 Test1 Option2
2015 1 Test1 Option3
OptionID OptionName OptionValue Year
-------------------------------------
1 Option1 A1 2016
2 Option2 A1a 2016
3 Option3 A3 2016
4 Option1 A1 2015
5 Option2 A2 2015
6 Option3 A2a 2015
SELECT *
FROM ProductMapping map
LEFT JOIN OptionList list ON map.OptionName = list.OptionName
AND map.Year = list.Year
AND map.OptionName = 'Option1'
我遇到的問題是如何通過查詢將該寬錶轉換爲兩個表結構,因爲它有很多列和行,並且我無法手動規範化所有這些。
是的,我也明白了理想的第二個表需要進一步保持選項1 ... 2選項在單獨的表,並在一個單獨的表Option1..A1映射的標準,但它是一個開始......
希望簡單的例子揭示了以下事實
- 選項1 ... 100列需要在一個單獨的表被歸
- 選項列值映射的光每年都在變化
有什麼想法?
您是否考慮過使用文檔存儲數據庫而不是關係型(表)數據庫?可擴展列是傳統RDBMS的一個弱點。 – Dai
太多的現有流程依賴於這些核心表......我正在嘗試將我的替代方案作爲概念驗證來擺脫我們正在進行的所有動態查詢 – SQLSeeker
爲什麼您需要兩個表格解決方案?這是什麼讓你無法用標準化的單表獲得?只需在第一個表中添加'OptionValue',你就可以將一切表格中的所有東西都歸一化。 –