VARCHAR 列的自动规范化?
Posted
技术标签:
【中文标题】VARCHAR 列的自动规范化?【英文标题】:Automatic Normalization of VARCHAR columns? 【发布时间】:2014-03-07 01:52:58 【问题描述】:假设您有许多表,其中有一个名为 Country
的 VARCHAR(50)
列,有少数不同的国家名称重复数百万次,这里明智的做法是创建一个名为 dbo.Country(CountryID, CountryName)
的表并让所有表都保存 CountryID
和外键引用。
问题是,每次我们想对该列做某事时,我们都必须使用dbo.Country
加入所有查询。
但是所有的连接似乎都遵循相同的模式,所以我的问题是,SQL Server 可以自动完成吗?例如,我会在某个表中指定一个名为 CountryName
的列,该列看起来像 VARCHAR
,但实际上存储为带有外键的 CountryID
,并且 SQL Server 可以在必要时隐式添加 JOIN。
SQL Server 或任何其他 SQL 数据库中是否有这样的功能?
【问题讨论】:
“问题是每次我们想要对那个列做某事时,我们都必须用 dbo.Country 加入我们的所有查询。” 这是一个误解。每次要显示国家名称时,您都必须加入。出于任何其他目的,无需加入,因为您的国家/地区 ID(请使用 ISO 3116-1 并为您省去很多麻烦)代表该国家/地区,就好像名称在数据库中一样;这就是关系的定义。 @Ben 我没有详细说明,以免问题太长,我的情况是我总是将这些数据连接到从其他来源导入的数据,有时我需要操作字符串值一点点,所以那是我需要进行连接的时候。 【参考方案1】:您不能“自动”执行此操作。但是,您确实有几个选择。
一种是在表格顶部创建一个自动进行连接的视图:
create view v_table as
select t.*, c.CountryName
from table t join
country c
on t.countryId = c.countryId;
或者,您可以将Country
设为枚举类型。这将允许它作为字符串访问,但存储为整数。
【讨论】:
以上是关于VARCHAR 列的自动规范化?的主要内容,如果未能解决你的问题,请参考以下文章