假设使用自动生成的ID作为device表的主键,而不是型号和序列号的自然组合。
id model sn detail
---------------------------
1 A 01 blah
2 A 02
3 B 01现在,为了将另一个表与device关联起来,您如何设计一个用于数据输入的表单,以便用户能够以自然的方式选择设备?也就是说,在组合框中选择型号,然后在下一个组合框中选择SN,这将只显示所选型号中的序列号作为选项。
如果第一个组合框是未绑定的,那么当您返回到表单进行查看时,模型将不会显示。如果第一个组合框绑定到model (或者更实际地说是model_id),第二个绑定到id (同时在组合框中显示sn以供用户选择),那么第一个完全是多余的,因此可能会违反正常形式。如果第一个绑定到model,第二个绑定到sn,那么我们只使用组合自然键,并可能完全去掉代理键。
我在使用自然键之前就这样做过,它工作得很好。但由于代理键似乎更受青睐,我想知道如何在这种设计选择下做到这一点。
发布于 2018-02-09 06:45:40
从用户的角度来看,将第一个绑定到model,第二个绑定到sn是最直观和现实的唯一可行的选择。假设我有一个带有model: B; sn: 01的设备。我将无法知道我的设备也是id: 3的,除非有一些标签指定它为id: 3,或者我被通知3是设备编号。但model和sn总是由制造商放在设备上。
从数据库的角度来看,这两个键都是有效的。密钥(id)和(model, sn)都是唯一标识设备的。拥有id是多余的,这是正确的,但它可以在相关表中用作表约束,以减少总DB大小(序列号可以很大,并且需要是CHAR的变体),并简化联接查询。
国际海事组织,两者兼备。只要涉及到用户,就使用密钥(model, sn),并使用(id)将所有相关的表连接在一起。
https://stackoverflow.com/questions/48694472
复制相似问题