Java 使用空字符串而不是null-一个好的实践?

Java 使用空字符串而不是null-一个好的实践?,java,hibernate,database-design,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的数据库与该数据库交互的程序。 我认为这意味着: 避免

例如,在数据库中考虑:

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的数据库与该数据库交互的程序。 我认为这意味着:

  • 避免NullPointerException
  • 避免检查空值的需要

这是好的做法吗?请举例说明优点和缺点。

好吧,缺点在于你无法区分“我没有为此字段输入任何内容”和空字符串。如果您不必担心空字符串,那就太好了。除非你的司机介绍他们。(我认为一些较老的方法只是将空字符串转换为java
null

以我的经验,这不是一个好的做法。根据您的用例,在需要的地方分配空值。您可以将all默认为空字符串,但将姓氏指定为空字符串或null(姓氏未知或不适用)(我知道这是一个糟糕的示例)。

正如Petermm所写,“null”具有特殊含义,通常由数据库引擎中的特殊运算符支持

“良好实践”是一个短语,它的意思是你想表达的任何意思,但要稍微解开论点:

  • 可维护性:坏主意。大多数开发人员已经习惯了在数据库系统中实现NULL的方式,并且需要在设计中接受特殊培训

  • 容错:坏主意。如果一列不允许为null,这通常意味着应用程序设计中的某些内容。如果用户记录必须具有有效的电子邮件地址,则您现在无法再在数据库级别验证该地址-因此您的数据库可能会逐渐充满虚假数据,并且只有在尝试向“”发送电子邮件时才能发现。“空指针”异常是特性,不是bug

  • 性能:根据,NULL速度较慢

    • 引用:

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


      因此,是的,最广泛使用的pythonweb框架考虑了您提出的最佳实践设计,并默认提供了这种行为。Java现在也在使用Java 8
      Optional
      null
      开始,也许是时候从这个角度重新考虑我们的DB设计了。

      在某些情况下这可能是个好主意,但这取决于具体情况。请注意,如果数据库是Oracle,空字符串将自动转换为NULL。