使用空字符串而不是null - 一个好习惯?

时间:2011-10-11 08:28:03

标签: java hibernate database-design

例如在数据库中考虑:

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与该数据库交互的程序。

在我看来,这意味着:

  • 避免NullPointerExceptions
  • 避免检查空值

这是好习惯吗?请举例说明优缺点。

5 个答案:

答案 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)

引用Django ORM docs

  

避免在基于字符串的字段(如CharField和TextField)上使用null,因为空字符串值将始终存储为空字符串,而不是NULL。如果基于字符串的字段具有null = True,则表示它具有“无数据”的两个可能值:NULL和空字符串。在大多数情况下,为“无数据”提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL。

所以,是的,最广泛使用的Python Web框架会考虑您提出的最佳实践设计并默认提供此行为。 Java现在也已经从null转移到了Java 8 Optional,或许是时候重新考虑我们的数据库设计了。