sql - 在不影响代码的情况下转换表格设计
问题描述
背景
我们有一个非常古老的数据库设计。最糟糕的例子是配置表。它是一行,每个值都有一个单独的列。它应该是键值对设置(显然)。它在我们的旧遗留代码和现在的基于 Web 的新代码中无处不在。可怕的是,现在有超过 300 列,更糟糕的是不时地添加更多。
目标
我很想把桌子扔进垃圾箱,然后用正确的键值对替换它。但是编码时间很短,所以我试图想出一种聪明的方法,将它显示为旧的旧代码行,以便从键值对中检索它。
尝试的解决方案
通常我会使用一个视图 - 但鉴于显示它的最佳代码(从这里捏:https ://stackoverflow.com/a/15745076/12059261 )是动态 SQL,我已经陷入困境,因为我不能使用动态视图中的 SQL(我的搜索告诉我视图不允许动态 SQL - 我假设这是正确的?)
表格示例
当前配置
键名地址等 1 我的公司 我的地址等
通缉配置
ID键值 1 名称我的公司 2 地址 我的地址 3等等等等
我想将表格从当前表格更改为新表格,但仍然能够将其作为当前表格显示为旧代码。
解决方案
如果问题是向旧代码显示新配置,则使用条件聚合:
create view oldconfig as
select max(case when key = 'Name' then value end) as name,
max(case when key = 'Address' then value end) as address,
. . .
from newconfig;
不用担心动态 SQL。遗留代码中使用了一组固定的列,这就是视图中需要包含的内容。如果添加新键,它们将不会出现在视图中,但可能无论如何旧代码都不会使用新键。
推荐阅读
- loops - 批量动态分配变量
- html - 为什么“-webkit-text-security: circle;”不 做任何事情?
- python-3.x - 为我想使用 Run Keywords 方法调用的所有关键字获取参数错误
- javascript - Git return "'pull' is not a git command. See 'git --help'" from remote on Windows 10
- vb.net - 按组合框中的值自动填充文本框
- wordpress - 在“编辑帖子”管理页面中显示自定义分类
- flutter - 飞行模式服务颤抖
- cordova - ionic 3 在 WKWebView 中启用摄像头和麦克风访问
- isabelle - 如何在 Isabelle 中创建适当的引理来证明这个引理?
- javascript - 显示警报而不是重定向到内部服务器错误页面?