【发布时间】:2014-08-11 12:25:13
【问题描述】:
我继承了一个导致我出现问题的数据库。
我需要向利益相关者描述一些可怕的事情。到目前为止,使用反模式的名称并将它们发送出去,将它们指向谷歌搜索,这是为我争取时间的最有效方法。
麻烦的是,我以前没有遇到过这种情况。这是正在发生的事情。
我有一个简单的单表,有几列。其中一列包含以下值:
660x90_SomeCity_SomeCountryISO_ImageName_SomeRubbish
或
SomeIataAirportCode_SomeCountry_660x90_SomeRubbish_ImageName
现在数据库包含一个(不可否认的是到目前为止和当前数据)无故障逻辑来提取和查找内容,以便输出具有额外的列,例如:
- 广告尺寸
- 国家
- 城市
问题在于,这是通过在 50 个(不是开玩笑的)不同视图的迷宫中实现的逐步转换来实现的。我现在必须将逻辑形式化为
- 查看一个:提取第一列并计算出它的长度。
- 视图二:现在使用长度拆分第二列。
- 查看三:如果替换第一列中的 x 后值为数字,则将该值存储在“AdSize”中,并将第二个值放在“CityCandidateOne”列中。
对我来说,这是一个可怕的反模式,应该全部在自定义函数中完成,或者最好在 ETL 过程中,在一个地方完成,以便捕获逻辑。
但是我没有时间,我想知道这是否是一种已知的反模式。通常我可以利用谷歌搜索的可信度来争取一点时间来真正解决这个问题。
【问题讨论】:
-
一列中有多个值是绝对不行的。它违反了第一范式。通常关系数据库至少是第三范式。如果我是你,我不会把时间浪费在提取数据的无穷无尽的视图和函数上。获取多列中的数据,重新考虑您的数据库设计...
-
我完全明白了。我将基表视为我的 ETL 的临时表和一个很好的规范化表输出 - 现在存在于最终视图中。我打算使用最后一个视图来填充新的规范化设计。然而,到达这一点的逻辑是如此分布在这 50 个奇怪的视图中,如果任何规则发生变化,我必须查看其中的大部分以进行修改。所以我想创建一个地方,负责说从这个复合源数据列中提取一个城市,不管格式如何,然后对城市做同样的事情,... .
-
为什么不使用存储过程,最好有一个 1000 行的存储过程,而不是在您需要更改时尝试跟踪 50 个视图或找出问题发生的原因。跨度>
标签: sql database-design anti-patterns