我必须维护一个具有许多文本数据类型的列的应用程序,其中插入多个值,用逗号,斜杠或有时甚至管道(|)字符分隔.我想弄明白你为什么要在地球上做这件事.
例如,订单表有一个名为详细信息的列,其中包含以下信息:
2x #ABC-12345 Widget, Black: $24.99 /4x #ABC-12344 Widget, Blue: $23.50
其中/
分离的行项目; 有一个VBScript代码,它从记录集中读取值并在一个For
循环中解析它,以便使用类似的东西进行显示(这几乎就是代码读取的方式,变量名和所有内容)arydtls = split(rstmp("details"), "/")
.在整个代码中针对各种表重复该方法.
在我看来,它只是100倍更好(更不用说更容易使用)只是将细节放在一个单独的表中并链接回它(有趣的是,对于Orders它确实这样做,但数据不始终匹配详细信息文本字段,因为OrderDetail表在代码中更新;详细信息字段在应用程序中被视为只读.
我的前任是否知道我没有做过的事情,或者说"WTF?!!"我是对的.当我看这个架构?它看起来像是非常低效且难以维护,并且它使运行报告更加困难,因为我需要的数据可能包含在文本字段中,或者它可能位于十几个具有相似信息的表中并且用于不同的表中部分应用程序.
两种最有可能的情况是:
你的前任不称职/不理解正常化
你的前任在规范化结构中遇到了一些性能问题,发现这种方法是一种改进
由于规范化在查询操作方面通常非常昂贵,因此我们有时可以通过消除昂贵的连接并在应用程序端对单行进行操作来获得性能提升.
数据库设计没有绝对的规则,即"在一个行中存储分隔值对于这种情况更好".这一切都是针对您的特定数据集和您的使用模式进行测试,并在必要时进行改进.
根据我的经验,这种模式对标准化的改进并不常见,但这种情况非常不典型.
编辑:第三种可能性是每行具有n值是对原始模式的更改,而不是添加新表,您的前任调整了列的大小.这不一定与"无能"选项有所不同:)但有时候数据库模式更改涉及政治压力......