【发布时间】:2016-08-11 18:13:28
【问题描述】:
我有一个非常宽的表像这样非规范化(如果你可以这么说的话),选项列达到 100+
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'
我遇到的问题是如何通过查询将该宽表转换为两个表结构,因为它有很多列和行,我无法手动规范所有这些。
是的,我也理解理想情况下,第二个表需要进一步规范化,以将 Option1...Option3 保存在单独的表中,并将 Option1..A1 映射保存在单独的表中,但这是一个开始......
希望这个简单的例子能阐明以下事实
- Option1...100 列需要在单独的表中进行规范化
- 映射到值的选项列每年都在变化
有什么想法吗?
【问题讨论】:
-
您是否考虑过使用文档存储数据库而不是关系(表)数据库?可扩展列是传统 RDBMS 的一个弱点。
-
太多现有进程依赖于这些核心表...我正在尝试我的替代方案作为概念证明来摆脱我们正在进行的所有动态查询
-
为什么需要一个两表解决方案?这为您带来了什么是规范化的单表无法获得的?只需将
OptionValue添加到您的第一个表中,您就可以将所有内容都放在一个表中,并进行规范化。 -
立即停止......并解雇设计这个的dba!
-
为什么不将值放在一个表中?