将空值用作未来数据的占位符是一种好习惯吗?

时间:2013-10-28 19:46:18

标签: mysql sql null many-to-many

我正在研究用户在不同时间输入各种数据的数据库。

目前我在三个表之间有多对多的关系。

tblDog:id,Name tblOwner:id,Name tblVet:id,name

tblDog_Owner_Vet:id,Dog_id,Owner_id,Vet_id

在一个完美的世界中,人们可以同时拥有将所有这三个实体连接在一起的所有信息,但用户可能现在有一些信息,然后更晚。因此,我让他们进入它,如果他们获得了信息,那么条目可能如下所示。我知道通常一只狗只有一个主人/兽医但是为了这个问题,请考虑一只狗可能有一个以上的主人和兽医:

  • 1,1,1,1
  • 2,2,2,null
  • 3,2,null,3

然后他们可以稍后返回并添加缺少的信息或合并两个结果相关联的行。

这样做可以或者所有这些空值都有问题吗?还有其他解决方案我可能会失踪吗?

3 个答案:

答案 0 :(得分:2)

正如Working with NULL Values所述:

  

从概念上讲,NULL表示“缺少未知值”

因此,在这种情况下,它正是您想要的。

您可能希望阅读criticisms surrounding the use of NULL,这是数据库世界中一个古老的争论。

答案 1 :(得分:0)

我只使用0(零)来取消设置外键列。 它在大多数情况下可能没有区别,但我喜欢它是一个int类型,并且在应用程序中测试总是更简单。

我本来只是将其添加为评论,但我还没有足够的代表。

答案 2 :(得分:0)

如你所说,使用空值有一个很大的缺点。多对多关系,或者在您的情况下,许多对多人使用复合主键来唯一标识记录。如您所知,主键列必须声明为非空。

解决方法是在所有者和兽医表中有记录,表明“不适用”或“无”或类似的东西。此外,您需要一个字段也是主键的一部分,在您的多对多表中指示记录当前是否为真。例如,如果您的桌子中有一只没有兽医的狗,您可以将“不适用”值分配给兽医区域。然后,当小狗获得兽医时,您添加一条新记录并更新此记录,表明它当前是假的。

编辑从此处开始

从评论中可以看出,“我不能只用新的兽医的身份证明该记录中的”无“_id?”。总有不止一种方法可以完成某些事情。更新记录是一种方法。另一个是删除“无id”记录并添加一个新记录。为了帮助决定,问问自己你打算如何处理所有者John决定不再欢迎Bloggins博士担任Fido兽医的情况。

此外,您没有删除null以保护外键约束。你这样做是因为vet_id将成为主键的一部分,所以它不能为空。