mysql - 数据库:我可以在第三范式数据库中拥有可为空的属性吗?

标签 mysql database

我有一个可以为 null 的 winnerID 属性,它会根据拍卖的出价不断更新。

此属性设置为在最后某个时间保存以计算谁赢得了拍卖。但是这个值最初是空的。

这会违反第三范式吗?我知道 1NF 的规则 4 规定我不能拥有可为空的属性,但注释说这是一个有争议的声明。

你能帮我澄清一下吗?谢谢!

最佳答案

空值在 SQL 中的定义方式——作为无法与域值进行比较的非值——意味着它们违反了 1NF(以及所有更高范数形式)。关系(由规范化表表示的数学结构)必须对每一行的每一列都有一个值。空值意味着我们没有值,可为空的列意味着我们在一个表中有两个关系 - 一个父类(super class)型关系,它包括除可为空的列之外的所有列,以及一个子类型关系,它具有相同的主键和先前可为空的列,对于我们只能记录属性已知的行。规范化的目的是在不丢失信息的情况下将数据集分解为基本事实,因此在单个表中有两个关系与目标相矛盾,并使关系代数/微积分等事情变得更加复杂。

范式是正式的逻辑定义结构,不是可以适应这种情况的工业最佳实践,所以我认为没有太多争议空间。我们是否应该使用它们以及如何处理它们是一个更有趣的话题。

虽然 null 违反了正常形式,但这并不意味着您不能在 SQL 数据库中使用 null。他们有风险也有好处。我也使用它们,但要慎重考虑。

关于mysql - 数据库:我可以在第三范式数据库中拥有可为空的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35683855/

相关文章:

mysql - 在 MySQL 中使用带有 HAVING 子句的 COUNT

mysql - 为什么准备好的语句由每个 session 管理?

php - 在 MySQL 中存储大量数据?

c# - 通过 GUI 查询工作正常,但在尝试通过 Dapper 运行时返回一般错误

mysql - 获取子查询 where 子句 id 与主查询中的 id 匹配

c++ - 如何用一个结果集处理程序消除多个相似的 sql 查询?

.net - Visual Studio 上的 ezdb 文件?

mysql - 数据库责任

mysql - SQL查询多表

php - 带有 INSERT 语句的简单 PHP CMS