将代理 id 键添加到遗留数据库中的无键表;它会如何影响与数据库通信的业务应用程序? [关闭]
Posted
技术标签:
【中文标题】将代理 id 键添加到遗留数据库中的无键表;它会如何影响与数据库通信的业务应用程序? [关闭]【英文标题】:Add surrogate id key to keyless tables in legacy database; how might it affect business applications that talk to the database? [closed] 【发布时间】:2014-05-26 10:44:33 【问题描述】:我问这个是因为我们一直在使用遗留数据库,如果您尝试在没有主键的表上放置 ORM 可能会出现问题。在这个论坛上,许多回答这个问题的人都说(在我看来,很冷漠),只需在表中添加一个主键。没什么大不了的。
现在我想问,如果你突然在现有数据库中的表中添加主键,你能想象到什么可能的负面影响,尤其是对客户端应用程序?如果问题太宽泛,那几乎已经回答了我的问题。
【问题讨论】:
这会对当前的业务应用程序产生负面影响,其方式可能超出您的想象。如果没有大量细节,我不确定这里的任何人都可以提供多大帮助。这就是存在测试服务的原因。在您的测试数据库中添加 pks,然后查看应用程序如何中断。修复应用程序而不是删除 PK,因为您已经注意到它们会派上用场。 我不认为 OP 要求我们想象新列会影响愚蠢的应用程序代码的每一种方式。而这种变化真的与添加一列没有什么不同。这里的主键约束是一条红鲱鱼;它由 dbms 自动维护,这也保证了唯一性,并且不会影响任何现有或未来行的唯一性(因为当前没有 键)。引入一个新列(在表的 end 处)几乎是您可以对现有表进行的最安全的结构更改。所以,简而言之,我认为这个问题并不太宽泛。 【参考方案1】:在开始之前,请确保没有任何其他机制来强制执行唯一性。例如,not null unique
声明在行为上等同于 primary key
声明。可能有触发器;可能存在需要数据库更新才能通过存储过程的权限;今天早上我可能还没有想到其他机制。
您似乎在谈论添加一个自动递增整数的列,并将其声明为主键。
假设当前确实没有主键,并且假设没有其他等效主键,主要问题涉及隐式依赖的应用程序代码根据列的顺序或列数。
例如,这是一个有效的 SQL 语句。您可能会在应用程序代码中发现类似的内容。
select *
from your_table
order by 1 desc;
该语句将按第一列中的值降序对结果集进行排序。
如果您向该表添加一列,并将该列定位为表定义中的第一列,则该 SQL 语句将开始以不同于其他客户端预期的顺序返回数据。
某些平台不允许alter table
语句更改列的顺序;新列仅出现在表定义的末尾。但即使在这些平台上,DBA 也可以转储数据,首先用新列重写create table
语句,然后重新加载数据。
此类问题(更改表中的列数)可能会中断某些数据导入和导出。
插入没有列名的语句,如insert into foo values (...)
可能会失败。
类似的语句也可能出现在触发器中,但这更多是数据库代码的问题,而不是应用程序代码的问题。
可能会出现性能问题。将新列用作聚集索引(某些平台上的选项)将改变行的物理顺序。这肯定会改变性能,但我无法预测这是否肯定是一件坏事。表格会更宽——但不会太多更宽——这意味着磁盘上的页面可以容纳的行数会稍微少一些。
弹性解决方案
更改现有表的名称。 (这很简单,但可能并不容易。) 创建与原始表具有相同结构和名称的可更新视图。 改变原表的结构。所有使用原始表名称的应用程序代码现在都将使用可更新视图的名称。由于视图的结构和行为与原始表相同,因此所有应用程序代码都应该继续工作。 (如果 应用程序 代码需要知道它是在处理表还是视图,我会感到惊讶,但这是一个可能的问题。)
注意事项
无论如何,您都不应该在生产环境中进行此更改首先。您应该首先在本地进行更改,然后在您的测试环境中进行更改,最后——当你用尽我们的集体想象力时——转移到生产环境。
一次一点地投入生产。添加列,然后等待一段时间。填充列,然后等待一段时间。重复直到完成。
【讨论】:
我会补充一点,如果表有大量记录,添加键的过程可能会很长。这可能是产品上的一个真正问题。您还将在您使用过 select * 的任何地方显示此键,这可能是不需要的。可能需要重新生成视图以包含该列(在 SQL Server 中甚至使用 select * 的视图)。如果您有插入语句,如果您没有指定列名,它们可能会中断。如果您调用字段 ID,您最终可能会遇到一些重复列名的问题,从而导致报告出现问题。某些触发器、数据导入或数据导出可能会中断。 我合并了你的 cmets,只跳过了更多关于数据库代码而不是应用程序代码的部分。谢谢。以上是关于将代理 id 键添加到遗留数据库中的无键表;它会如何影响与数据库通信的业务应用程序? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章