例如在数据库中考虑:
CREATE TABLE users (
id INTEGER IDENTITY PRIMARY KEY,
last_name VARCHAR (50) DEFAULT '' NOT NULL,
first_name VARCHAR (50) DEFAULT '' NOT NULL,
email VARCHAR(50) DEFAULT '' NOT NULL)
考虑使用Hibernate作为ORM与该数据库交互的程序。
在我看来,这意味着:
这是好习惯吗?请举例说明优缺点。
答案 0 :(得分:7)
正如PeterMmm所写,“Null”具有特殊含义,并且通常由数据库引擎中的特殊运算符支持。
“良好实践”是这些短语之一,意味着你想要它意味着什么,但稍微解开论点:
可维护性:糟糕的主意。大多数开发人员习惯于在数据库系统中实现NULL,并且需要对您的设计进行特殊培训。
容错:不好主意。如果不允许列为null,那通常意味着应用程序设计中的某些内容。如果用户记录必须有一个有效的电子邮件地址,您现在不能再在数据库级别验证这一点 - 因此您的数据库可能会逐渐填满虚假数据,并且您只会在尝试发送电子邮件时找到至 ''。 “空指针”异常是功能,而不是错误!
性能:根据http://www.sql-server-performance.com/2007/datatypes/,NULL更慢。
答案 1 :(得分:4)
好吧,骗局是因为你无法区分“我没有为这个字段输入任何东西”和空字符串。你永远不必担心空字符串会很好。除非你的司机介绍他们。 (我认为一些较旧的只是将空字符串转换为java null
。)
答案 2 :(得分:4)
根据我的经验,这不是一个好习惯。在需要的地方指定null
答案 3 :(得分:4)
这取决于您的使用案例。 null is a special value and has a special semantic。你可以将所有默认为空字符串,但是将last_name设置为空字符串或null(姓氏未知或不适用)可能是非常不同的(不好的例子,我知道)。
答案 4 :(得分:0)
避免在基于字符串的字段(如CharField和TextField)上使用null,因为空字符串值将始终存储为空字符串,而不是NULL。如果基于字符串的字段具有null = True,则表示它具有“无数据”的两个可能值:NULL和空字符串。在大多数情况下,为“无数据”提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL。
所以,是的,最广泛使用的Python Web框架会考虑您提出的最佳实践设计并默认提供此行为。 Java现在也已经从null
转移到了Java 8 Optional
,或许是时候重新考虑我们的数据库设计了。