如果我使用null作为数据库表中所有内容的表示是不好的做法?
即
我有表:myTable(ID)和myRelatedTable(ID,myTableID)
myRelatedTable.myTableID是myTable.ID的FK
我想要完成的是:如果myRelatedTable.myTableID为null,那么我的业务逻辑会将其解释为链接到所有myTable行。
我想这样做的原因是因为在创建myRelatedTable行之后我有一些未知的行可以插入到myTable中,并且myRelatedTable中的某些行需要引用myTable中的所有现有行。
答案 0 :(得分:13)
我认为您可能会同意使用数字 3 来表示 3 以外的其他值。
因此,使用NULL来表示除缺少值之外的任何内容都是一个坏主意。
如果您不同意并将NULL转换为其他目的,那么追随您的维护程序员将不会感激。
答案 1 :(得分:1)
不是一个好主意,因为那时你根本不能在SQL查询中使用“与所有条目相关”的事实。在某些时候,你可能想要/需要这样做。
答案 2 :(得分:1)
理想情况下,根本不应该有空值。应该有另一个表来表示这种关系。
如果要分配特殊含义,但NULL应该只表示“未分配” - 即不存在关系,使用负数,即如果要触发某些业务层欺骗,则为-1。对于任何未来遇到这种情况的开发人员来说,显而易见的是-1是一个非常值,不应该被视为正常值。
答案 3 :(得分:0)
我不认为NULL是最好的方法,但你可以使用一个单独的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
答案 4 :(得分:0)
是的,原因很简单NULL
代表无价值。没有特殊价值;不是空白值,而是空白。
如果外键只是一个简单的整数,并且它是自动生成的,那么你可以使用0表示“魔术”值。
答案 5 :(得分:0)
您发布的内容,即外键中的NULL与引用表中的所有行断言关系,非常不标准。在我的头顶,我认为它充满了危险。
大多数在FK中使用NULL的人的意思是它在引用表中断言与NONE的关系。这在可选关系的情况下很常见,可以发生零次。
示例:我们有一个HR数据库,其中有一个名为“EMPLOYEES”的表。我们有两列,名为“EmpID”和“SupervisorID”。 (很多人称第一列只是“ID”)。表中的每位员工都有一个SupervisorID下的条目,唯一的例外是公司的CEO。 CEO在SupervisorID列中有一个NULL,这意味着CEO没有主管。首席执行官对BOD负责,但在SupervisorID中没有表示。
与引用表中的所有行的关系可能意味着什么:有问题的行与引用表中的任何一行之间存在可能的关系。当你开始深入了解在现实世界中但在数据库中未知的事实的问题时,你会打开一大堆蠕虫。