0

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

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

tblDog:id,名称 tblOwner:id,名称 tblVet:id,名称

tblDog_Owner_Vet:id、Dog_id、Owner_id、Vet_id

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

  • 1, 1, 1, 1
  • 2, 2, 2, 空
  • 3, 2, 空, 3

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

这是可以做的还是所有这些空值都是一个问题?我可能会缺少另一种解决方案吗?

4

3 回答 3

2

使用NULL下所述:

从概念上讲,NULL意思是“缺失的未知值”</p>

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

但是,您可能想阅读有关使用 . 的批评NULL,这是数据库世界中一个由来已久的争论。

于 2013-10-28T19:54:13.637 回答
0

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

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

编辑从这里开始

从评论中,“我不能用新兽医的 id 重写该记录中的“none”_id 吗?”。完成某事的方法总是不止一种。更新记录是一种方法。另一个是删除“none id”记录并添加一个新记录。为了帮助做出决定,问问自己你打算如何处理主人约翰决定不再欢迎博金斯博士作为 Fido 的兽医的情况。

此外,您不会摆脱 null 来保护外键约束。您这样做是因为 vet_id 将是主键的一部分,因此它不能为空。

于 2013-10-28T21:42:45.140 回答
0

我只是将 0(零)用于未设置的外键列。在大多数情况下它可能没有什么不同,但我喜欢它是一个 int 类型,并且在应用程序中测试总是更简单。

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

于 2013-10-28T20:07:34.873 回答