如果我在数据库中有一个不需要的varchar字段怎么办?例如中间名。
但是,如果我想清楚数据不可用的原因怎么办?
但是如果数据类型不是文本呢?例如,工资,我不能说'未指定'或者'不适用' (无业)。
我能想到解决方案,但我想知道这些想法是好还是坏。
1)创建flag(tinyint)列,原因不同,为什么它为null:
| Salary Unspecified | Salary Not Applicable |
2)创建一个varchar列,原因是字段为空:
| WhySalaryIsNotAvailable |
这两种解决方案对我来说都很奇怪。我以前没见过它,所以我不确定是否要做其中任何一个。
你如何处理这个问题?
上述任何解决方案都可以吗?
答案 0 :(得分:3)
你应该妥协并以NULL
定居。它在整个数据库系统中进行处理,比较等等。
您可以在另一列中添加原因。对于带有名称的示例,我可能倾向于拥有多个列(包括昵称和敬语等可选项),也可能使用名称"格式"。
名称的特定例子没有引起共鸣。我不确定我是否真的知道没有中间名和不适用的中间名之间的区别。
注意:您始终可以在另一列中包含此信息。但是你的比较代码开始变得相当复杂。例如,如果你为中间名输入一个空白(空字符串),但原因不同,那么:
on x1.middlename = x2.middlename
会匹配,除非你包括原因。
答案 1 :(得分:2)
如果属性是字符串,则允许n/a
和unknown
相对容易。但是,以下示例(设计)更为通用。
-- 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
;