使用空字符串代替null - 是一种好的实践吗?

3
例如,在数据库中考虑以下内容:
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 - 避免检查null值的需要
这是好的做法吗?请给出利弊的例子。

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

7
正如PeterMmm所写,“Null”具有特殊的含义,并且通常由数据库引擎中的特殊操作符支持。
“良好的实践”是那些可以随你意愿解释的短语之一,但是对其进行一些论证:
- 可维护性:不好的想法。大多数开发人员习惯于数据库系统中NULL的实现方式,将需要针对你的设计接受特殊的培训。 - 容错能力:不好的想法。如果一个列不允许为null,这通常意味着在应用程序设计中有特定要求。如果用户记录必须有电子邮件地址才能有效,则无法在数据库级别上验证此内容 - 因此,你的数据库可能会逐渐填满虚假数据,并且只有当你尝试发送电子邮件到''时才会发现这个问题。“空指针”异常是一种特性,而不是错误! - 性能:根据http://www.sql-server-performance.com/2007/datatypes/,NULL速度较慢。

5
这取决于你的使用情况。null是一个特殊的值,并具有特殊的语义。你可以将所有内容默认为空字符串,但是如果last_name是空字符串或null(姓氏未知或不适用)(这是一个糟糕的例子),则可能会产生非常不同的结果。

4

那么,缺点在于您无法区分“我没有为这个字段输入任何内容”和空字符串。优点在于您永远不必担心空字符串,除非您的驱动程序引入它们。(我认为一些旧驱动程序将空字符串转换为Java null。)


4
在我的经验中,这并不是一个好的做法。在需要时分配null值。

0

引用 Django ORM 文档

避免在基于字符串的字段(如 CharField 和 TextField)上使用 null,因为空字符串值始终会被存储为空字符串,而不是 NULL。如果一个基于字符串的字段具有 null=True,则意味着它有两个可能的“无数据”值:NULL 和空字符串。在大多数情况下,拥有两个可能的“无数据”值是多余的;Django 的惯例是使用空字符串,而不是 NULL。

因此,是的,最广泛使用的 Python Web 框架认为您提出的设计是最佳实践,并默认提供此行为。Java 也正在现在摒弃 null,并采用 Java 8 的 Optional,或许现在是时候基于这种思路重新考虑我们的数据库设计了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接