替代RDBM中的NULL

时间:2017-03-11 15:32:20

标签: sql database-design

如果我在数据库中有一个不需要的varchar字段怎么办?例如中间名。

  • 简单,我会让它可以为空。

但是,如果我想清楚数据不可用的原因怎么办?

  • 然后我会说出像“未知”这样的内容。或者'不适用' (中国?)

但是如果数据类型不是文本呢?例如,工资,我不能说'未指定'或者'不适用' (无业)。

我能想到解决方案,但我想知道这些想法是好还是坏。

1)创建flag(tinyint)列,原因不同,为什么它为null:

| Salary Unspecified | Salary Not Applicable |

2)创建一个varchar列,原因是字段为空:

| WhySalaryIsNotAvailable |

这两种解决方案对我来说都很奇怪。我以前没见过它,所以我不确定是否要做其中任何一个。

你如何处理这个问题?

上述任何解决方案都可以吗?

2 个答案:

答案 0 :(得分:3)

你应该妥协并以NULL定居。它在整个数据库系统中进行处理,比较等等。

您可以在另一列中添加原因。对于带有名称的示例,我可能倾向于拥有多个列(包括昵称和敬语等可选项),也可能使用名称"格式"。

名称的特定例子没有引起共鸣。我不确定我是否真的知道没有中间名和不适用的中间名之间的区别。

注意:您始终可以在另一列中包含此信息。但是你的比较代码开始变得相当复杂。例如,如果你为中间名输入一个空白(空字符串),但原因不同,那么:

on x1.middlename = x2.middlename

会匹配,除非你包括原因。

答案 1 :(得分:2)

如果属性是字符串,则允许n/aunknown相对容易。但是,以下示例(设计)更为通用。

-- Employee (EMP) exists.
--
Employee {EMP}
     KEY {EMP}


-- Employee (EMP) receives regular salary.
--
SalariedEmp {EMP}
        KEY {EMP}
FOREIGN KEY {EMP} REFERENCES Employee {EMP}



-- Employee (EMP) receives salary of $ (SALARY).
--
EmployeeSalary {EMP, SALARY}
           KEY {EMP}
   FOREIGN KEY {EMP} REFERENCES SalariedEmp {EMP}



-- Employee (EMP) does not receive regular salary.
--
UnSalariedEmp {EMP}
          KEY {EMP}

-- derive as a view
CREATE VIEW UnSalariedEmp AS
SELECT EMP from Employee
EXCEPT
SELECT EMP from SalariedEmp
;