Every individual scalar value in the database must be logically addressable by specifying the name of the containing table,the name of the containing column and the primary key value of the containing row.
在sql世界中,这意味着表中永远不会存在两行,所有列值都相等.如果没有有意义的方法来保证唯一性,则可以向表格提供代理键.
当第一个sql标准发布时,它没有定义这样的限制,从那时起它就像这样.这似乎是所有邪恶的根源.
是否有任何有意义的理由决定采用这种方式?在实际的世界中,没有这种限制可以证明是有用的吗?它是否超过缺点?
解决方法
一个不需要主键的明显例子是某些描述的“状态”日志(天气/数据库/无论如何).如果您永远不会查询此表中的单个值,则可能不希望拥有主键以避免必须等待插入到键中.如果你有一个用例从这个表中获取一个值,那么肯定,这将是一个糟糕的解决方案,但有些人不需要它.如果绝对必要,您可以随后添加代理键.
另一个例子是写密集型应用程序需要告诉另一个进程做某事.这个辅助过程每N分钟/小时/无论如何运行.对N0000个记录进行一次性重复数据删除比检查每个插入表中的唯一性更快(相信我).
作为关系数据库销售的产品不仅仅用作关系数据库.它们被用作日志,键值存储,图形数据库等.它们可能没有竞争对手的所有功能,但有些可以做到并且通常更简单的是让单个表不适合您的关系模型而不是创建整个其他数据库并遭受数据传输性能损失.
tl; dr人们在数学上并不完美,因此不会总是使用数学上完美的做法.委员会由人组成,有时可以实现这一目标.