VARCHAR 列的自动规范化?

Posted

技术标签:

【中文标题】VARCHAR 列的自动规范化?【英文标题】:Automatic Normalization of VARCHAR columns? 【发布时间】:2014-03-07 01:52:58 【问题描述】:

假设您有许多表,其中有一个名为 CountryVARCHAR(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 列的自动规范化?的主要内容,如果未能解决你的问题,请参考以下文章

基于拆分和列的规范化(重塑)数据框

创建表的规范 nvarchar2,varchar2

如何为 SQL 表自动生成数据类型

MySQL开发规范中必须禁用char()

sklearn 分类器管道所需的“列的有效规范”是啥?

代码对列的规范抛出错误