我需要将所有扫描(条形码/指纹等)事件存储到表中,如果是扫描链接到数据库中的人,请将扫描链接到该人。所以,我也需要存储无效扫描。
我有几个选择。
UserScan表,其中包含有关扫描的详细信息,以及User表中可以为空的UserID外键,只有在我们进行有效扫描时才会填充该表。
或
一个UserScan表,其中包含有关扫描的所有详细信息,以及一个NOT NULL FK到用户表,并且只向该表写入有效扫描,加上“失败扫描”表,仅包含有关扫描的详细信息。
也许有其他选择?
这个表格相当大,例如,很多查询将使用此表来确定谁在某个时间位于什么位置。可以为空的UserID是一个不太理想的选择吗?或者是推荐的吗?
我想的可能是一个'扫描事件'表,其中包含所有扫描,如果扫描成功,还有一个UserScanEvent表,带有扫描事件ID和用户ID。但这看起来像是一对多链接表。
我正在寻找效率最好的设计。哪种方式最好,也许还有更好的主意?
答案 0 :(得分:0)
选项1:
我认为从选择效率的角度来看,选项1可能会使用userId
表中UserScan
列的过滤索引为您提供最佳结果。
选项2:
你的第二个选项可能是最糟糕的选择,因为这意味着你的数据库中将有两个几乎相同的表结构,这是一个糟糕的设计。
选项3:
在学术层面,选项3是要走的路。可空列在关系模型中不受欢迎。要防止UserScanEvent
表在扫描和人员之间创建多对多关系,请在scanId
列上添加唯一约束。这样,此表中的每次扫描只能与一个人相关联。
总结一下:
说了这么多,选择效率是一个难以预测的事情。我的预感告诉我,选项1虽然可能不是关系模型的最佳选择,但是可以实现更快的选择执行然后选项3,但正如Jorge Campos在他的评论中所写,这仅仅是我的观点,这不是我能说的当然。