gpt4 book ai didi

sql - 糟糕的数据库设计

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:36 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

View 的 Insert 和 Update 语句具有将旧的单值列转换为个别专栏。删除 View 会删除底层基表行。

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

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

关于sql - 糟糕的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17284488/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com