代码之家  ›  专栏  ›  技术社区  ›  Element

是否使用空值表示值错误做法?

  •  4
  • Element  · 技术社区  · 16 年前

    如果我使用空值来表示数据库表中的所有内容,那么这是一种坏做法吗?

    我有表:myTable(id)和myRelatedTable(id,myTableid)

    myrelatedtable.mytable id是mytable.id的fk

    我要完成的是:如果myRelatedTable.myTableID为空,那么我的业务逻辑将把它解释为链接到所有myTable行。

    我之所以要这样做是因为在创建myrelatedtable行之后,我有一个Uknown数量的行可以插入mytable,myrelatedtable中的一些行需要引用mytable中的所有现有行。

    6 回复  |  直到 16 年前
        1
  •  0
  •   Turnkey    16 年前

    我不认为空是最好的方法,但您可以使用单独的tinyint列来指示myrelatedtable中的行与mytable中的所有内容相关,例如myrelatedtable.relatedall。这将使其他必须维护它的人更加明确。然后您可以执行某种联合查询,例如

    SELECT M.ID, R.ID AS RelatedTableID,....
    FROM MyTable M INNER JOIN MyRelated Table R ON R.myTableId = M.Id
    UNION
    SELECT M.ID, R.ID AS RelatedTableID,....
    FROM MyTable M, MyRelatedTable R
    WHERE R.RelatedAll = 1
    
        2
  •  13
  •   Ed Guiness    16 年前

    我想你可能会同意使用这个号码是不好的 表示另一个值 .

    根据同样的推理,使用空来表示除缺少值之外的任何东西是一个坏主意。

    如果您不同意并将空值转换为其他目的,那么在您之后出现的维护程序员将不会感激。

        3
  •  1
  •   Michael Borgwardt    16 年前

    这不是一个好主意,因为在SQL查询中根本不能使用“与所有条目相关”的事实。在某种程度上,你可能想/需要这样做。

        4
  •  1
  •   dice    16 年前

    理想情况下,根本不应该有空值。应该有另一个表来表示关系。

    如果您要分配特殊的含义,但是空值应该只意味着“未分配”——即不存在任何关系,使用负数,即-1,如果您想触发一些业务层欺骗。对于任何将来遇到这种情况的开发人员来说,很明显-1是一个不应该被视为正常值的非凡值。

        5
  •  0
  •   Rob    16 年前

    是的,原因很简单 NULL 代表 无价值 . 不是一个特殊值;不是一个空值,但什么也没有。

    如果外键只是一个简单的整数,并且它是自动生成的,那么您可以使用0来表示“magic”值。

        6
  •  0
  •   Walter Mitty    16 年前

    您发布的内容,即外键中的空断言与被引用表中所有行的关系,是非常不标准的。从我的头顶上看,我认为这充满了危险。

    在fks中使用nulls的大多数人的意思是,它断言与被引用表中的任何行都没有关系。这在可选关系的情况下很常见,这种关系可以发生零次。

    示例:我们有一个HR数据库,其中有一个名为“Employees”的表。我们有两列,分别称为“empid”和“supervisorid”。(许多人将第一列简单地称为“id”)。表中的每个员工都有一个受监督的条目,公司CEO除外。CEO在supervisorid列中有一个空值,这意味着CEO没有主管。首席执行官对董事会负责,但监管部门不代表首席执行官。

    您所指的与引用表中所有行的关系是:有问题的行与引用表中的任何一行之间可能存在关系。当你开始思考现实世界中的事实,但数据库不知道这些事实的问题时,你就会打开一大罐蠕虫。