数据库设计不佳

时间:2013-06-24 20:27:25

标签: sql database

我正在开发一个系统,前一个开发人员喜欢在单个单元格中保存多个值。请参阅下面的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于01/01/2000访问了该商店。第2行说,2000年1月1日,客户2访问了商店等....

我知道这很糟糕。我想不出一种合理的解决方法,因为应用程序有很多数组可以拆分'values'的内容。我想这样:

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用Insert,Update和Delete触发器创建SQL视图。视图Select语句连接重构表以提供单个“值”列。重构表可以使用原子值列正确标准化。

视图Insert和Update语句具有将旧单值列转换为的功能 个别专栏。删除视图会删除基础基表行。

因此SQL视图为您提供了一层隔离和封装,因此您无需重构遗留代码。重构可以根据需要逐步进行。使用视图可以比较性能。 SQL优化器将负责这一点。可能的开销是连接和解除连接值的函数。

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

答案 1 :(得分:2)

为date和int添加新列,保留旧字符串列,但更改更新并插入代码以维护新列。

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

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

Computed Columns