【问题标题】:Best practices for normalizing a table and converting a nvarchar column to a foreign key reference规范化表并将 nvarchar 列转换为外键引用的最佳实践
【发布时间】:2017-10-31 12:47:41
【问题描述】:

我在 T-SQL 中有一个大的、未规范化的表。想象一下它有以下结构:

tbl_Item:
ItemID
ItemName
ItemGroup
Price

这样的数据:

1 - ItemA - GroupA - $9.99
2 - ItemB - GroupA - $9.99
3 - ItemC - GroupA - $9.99
4 - ItemX - GroupB - $4.00
5 - ItemY - GroupB - $4.00

我想将其标准化为两个全新的表:

tbl_Item:
ItemID
ItemName
FK_Group

和:

tbl_Group:
GroupID
GroupName
Price

我遇到的问题是从初始表中获取 ItemGroup 数据并将其替换为新表的相应 GroupID。我将通过运行填充 tbl_Group 表:

SELECT DISTINCT ItemGroup FROM tbl_Item

...并将所有值插入 tbl_Group,从而给它们一个 ID 号。

我能看到的唯一方法是编写一个循环遍历 tbl_Item 的脚本,根据新的 tbl_Group 表查询 ItemGroup 列,并将 ID 插入到新的 item 表的 FK_Group 列中。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 这种转换不是“规范化”,它用连接回它的投影来替换表。

标签: sql sql-server database tsql database-normalization


【解决方案1】:

您可以将表创建为:

select identity() as GroupId, GroupName, Price 
into tbl_groups
from tbl_item
group by GroupName, Price;

或者,将表创建为:

create table tbl_groups (
    GroupId int identity() primary key,
    GroupName varchar(255),
    Price number(10, 2)
);

insert into tbl_groups(GroupName, Price)
    select distinct GroupName, Price
    from tbl_Items;

【讨论】:

    猜你喜欢
    • 2021-07-15
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2020-10-26
    • 2018-04-03
    • 2015-05-19
    相关资源
    最近更新 更多