Nullable FK vs两张桌子

时间:2016-06-14 23:28:13

标签: sql sql-server database

我需要将所有扫描(条形码/指纹等)事件存储到表中,如果是扫描链接到数据库中的人,请将扫描链接到该人。所以,我也需要存储无效扫描。

我有几个选择。

UserScan表,其中包含有关扫描的详细信息,以及User表中可以为空的UserID外键,只有在我们进行有效扫描时才会填充该表。

一个UserScan表,其中包含有关扫描的所有详细信息,以及一个NOT NULL FK到用户表,并且只向该表写入有效扫描,加上“失败扫描”表,仅包含有关扫描的详细信息。

也许有其他选择?

这个表格相当大,例如,很多查询将使用此表来确定谁在某个时间位于什么位置。可以为空的UserID是一个不太理想的选择吗?或者是推荐的吗?

我想的可能是一个'扫描事件'表,其中包含所有扫描,如果扫描成功,还有一个UserScanEvent表,带有扫描事件ID和用户ID。但这看起来像是一对多链接表。

我正在寻找效率最好的设计。哪种方式最好,也许还有更好的主意?

1 个答案:

答案 0 :(得分:0)

选项1:
我认为从选择效率的角度来看,选项1可能会使用userId表中UserScan列的过滤索引为您提供最佳结果。

选项2:
你的第二个选项可能是最糟糕的选择,因为这意味着你的数据库中将有两个几乎相同的表结构,这是一个糟糕的设计。

选项3:
在学术层面,选项3是要走的路。可空列在关系模型中不受欢迎。要防止UserScanEvent表在扫描和人员之间创建多对多关系,请在scanId列上添加唯一约束。这样,此表中的每次扫描只能与一个人相关联。

总结一下:
说了这么多,选择效率是一个难以预测的事情。我的预感告诉我,选项1虽然可能不是关系模型的最佳选择,但是可以实现更快的选择执行然后选项3,但正如Jorge Campos在他的评论中所写,这仅仅是我的观点,这不是我能说的当然。