3

我正在开发一个系统,以前的开发人员喜欢在单个单元格中保存多个值。请参阅下面的 DDL:

create table visits (id int, values varchar(100))     

INSERT INTO visits values (1, '01/01/2000, 1')
INSERT INTO visits values (2, '01/01/2000, 2')
INSERT INTO visits values (3, '01/01/2000, 3')

第 1 行表示客户 1 于 2000 年 1 月 1 日访问了该商店。第 2 行说 2000 年 1 月 1 日,客户 2 访问了商店等......

我知道这很可怜。我想不出一种合理的方法来解决这个问题,因为应用程序有很多数组可以拆分“值”的内容。我想这样做:

create table visits (id int, visitdate datetime, customerid int)

但是,这样做会导致错误,因为拆分值列的数组只包含一个值而不是两个。我相信我必须重构整个代码库来解决这个问题,即删除数组。但是,还有其他方法可以解决这个问题吗?

4

2 回答 2

3

您可以使用插入、更新和删除触发器创建 SQL 视图。视图 Select 语句连接重构表以提供单个“值”列。重构的表可以使用原子值列正确规范化。

视图插入和更新语句具有将旧的单个值列转换为单个列的功能。视图的删除将删除基础基表行。

因此 SQL 视图为您提供了一层隔离和封装,因此您无需重构遗留代码。重构可以根据需要以增量方式进行。使用视图的性能应该是可比的。SQL 优化器会处理这个问题。可能的开销是连接和取消连接值的函数。

使用重构表,具有原子值列允许您创建更具选择性的索引。它们可用于加快一些关键查询。

于 2013-06-25T12:50:35.087 回答
2

为日期和整数添加新列,保留旧的字符串列,但更改更新和插入代码以维护新列。

然后,您必须重构所有插入/更新代码以包含新列。

支持旧版“拆分”代码:如果您使用的是 SQL 2005 或更高版本,则可以将“值”列替换为“计算列”。如果不是,您可以创建一个具有额外“值”列的视图,并从真实表中删除“值”。

计算列

于 2013-06-24T20:40:48.527 回答