Sal*_*ali 10 schema postgresql null
我有一个应用程序(数据存储在 PostgreSQL 中),其中表中的大多数字段始终不为空,但这些表的架构并未强制执行此操作。例如看看这个假表:
CREATE TABLE "tbl" (
"id" serial,
"name" varchar(40),
"num" int,
"time" timestamp
PRIMARY KEY ("id"),
UNIQUE ("id")
);
Run Code Online (Sandbox Code Playgroud)
此外name,num,time没有明确声明为NOT NULL,实际上它们是,因为强制执行发生在应用程序端。
我的感觉是应该改变它,但相反的是应用程序级别确保这里不能出现空值并且没有其他人手动修改表。
我的问题是:通过设置一个显式NOT NULL约束?
我们有一个很好的代码审查流程和一个相当好的文档,所以一些新人会提交打破这个限制的东西的可能性并不足以证明改变是合理的。
这不是我的决定,所以这正是我寻找其他理由的原因。在我看来,如果某些内容不能为空并且数据库允许您指定某些内容不为空 - 那就去做吧。特别是如果更改非常简单。
当新程序员到来并且必须针对该数据库编写应用程序时会发生什么?他们不知道字段 x必须是NOT NULL。
另一个程序可能假设所有字段 x 都NOT NULL用于执行计数,但现在有些是NULL因为新程序,导致不一致和难以追踪的错误。
恕我直言,最好在尽可能靠近数据的地方执行数据完整性规则,即在数据库中。这样,新的应用程序和/或程序员就不会弄乱您的数据。
程序员、应用程序、语言和框架来来去去。数据和数据库往往是持久的。数据库是您抵御不一致、潜在错误数据的最后一道防线。
做最大利用你的数据库的完整性约束执法机制,甚至不惜牺牲性能为代价。产生正确的结果的慢行系统是无限优于快一个把事情错了!
正如其他人在评论中已经引用的那样,添加NOT NULL到您的表规范可以显着提高查询的性能(除了另一个答案中陈述的非常好的方法论原因)。
原因是查询优化器知道列不能有NULL值,可以排除对这些值的特殊测试,就像在NOT INvs.NOT EXISTS情况下一样。例如,您可以看到此博客,其中显示不NOT NULL使用特定查询声明字段(当表始终包含非空值时)会增加 500% 的执行时间。结果显示为 SQL Server,但类似的行为可能存在于其他关系 DBMS 中,例如您的(更不用说您的数据库可以移植到其他系统的事实)。您可以假设的一般规则是,当查询优化器可以使用更多信息时,可以生成更高效的访问计划。