首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在数据库表单中实现代理键代替复合自然键

如何在数据库表单中实现代理键代替复合自然键
EN

Stack Overflow用户
提问于 2018-02-09 04:43:28
回答 1查看 36关注 0票数 0

假设使用自动生成的ID作为device表的主键,而不是型号和序列号的自然组合。

代码语言:javascript
复制
id    model   sn     detail      
---------------------------
1     A       01     blah
2     A       02
3     B       01

现在,为了将另一个表与device关联起来,您如何设计一个用于数据输入的表单,以便用户能够以自然的方式选择设备?也就是说,在组合框中选择型号,然后在下一个组合框中选择SN,这将只显示所选型号中的序列号作为选项。

如果第一个组合框是未绑定的,那么当您返回到表单进行查看时,模型将不会显示。如果第一个组合框绑定到model (或者更实际地说是model_id),第二个绑定到id (同时在组合框中显示sn以供用户选择),那么第一个完全是多余的,因此可能会违反正常形式。如果第一个绑定到model,第二个绑定到sn,那么我们只使用组合自然键,并可能完全去掉代理键。

我在使用自然键之前就这样做过,它工作得很好。但由于代理键似乎更受青睐,我想知道如何在这种设计选择下做到这一点。

EN

回答 1

Stack Overflow用户

发布于 2018-02-09 06:45:40

从用户的角度来看,将第一个绑定到model,第二个绑定到sn是最直观和现实的唯一可行的选择。假设我有一个带有model: B; sn: 01的设备。我将无法知道我的设备也是id: 3的,除非有一些标签指定它为id: 3,或者我被通知3是设备编号。但modelsn总是由制造商放在设备上。

从数据库的角度来看,这两个键都是有效的。密钥(id)(model, sn)都是唯一标识设备的。拥有id是多余的,这是正确的,但它可以在相关表中用作表约束,以减少总DB大小(序列号可以很大,并且需要是CHAR的变体),并简化联接查询。

国际海事组织,两者兼备。只要涉及到用户,就使用密钥(model, sn),并使用(id)将所有相关的表连接在一起。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48694472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档