如何用数据库形式代替复合自然键来实现代理键

时间:2018-02-08 20:43:28

标签: database forms database-design

假设自动生成的ID用作id model sn detail --------------------------- 1 A 01 blah 2 A 02 3 B 01 表的主键,而不是模型和序列号的自然组合。

device

现在,为了将另一个表与model相关联,您如何设计数据输入表单,以便用户可以自然地选择设备?也就是说,在组合框中选择模型,然后在下一个组合框中选择SN,该组合框仅显示所选模型中的序列号作为选项。

如果第一个组合框未绑定,则返回表单进行审核时,模型将不会显示。如果第一个组合框绑定到model_id(或更真实地id),第二个组合框绑定到sn(同时在组合框中显示model供用户选择),那么第一个是完全多余的,因此可能违反正常形式。如果第一个绑定到sn而第二个绑定到reader.onload = (e) => { this.gotText(e.target.result); }; reader.readAsText(file); ,那么我们只是使用复合自然键,并且可能完全摆脱代理键。

我在使用自然键之前已经完成了这项工作并且运行良好。但由于代理键似乎受到青睐,我想知道如果设计选择会如何完成。

1 个答案:

答案 0 :(得分:2)

从用户的角度来看,第一个绑定到sn而第二个绑定到model: B; sn: 01是最直观和现实唯一可行的选择。假设我的设备有id: 3。我将无法知道我的设备也是id: 3,除非有一些贴纸将其指定为3或我收到model是设备编号的通知。但sn(id)始终由制造商放置在设备上。

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

IMO,两者都有。每当涉及用户时使用密钥(id)并使用// Create a blank image and add some text $im = imagecreatetruecolor(120, 20); $text_color = imagecolorallocate($im, 233, 14, 91); imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color); // Set the content type header - in this case image/jpeg header('Content-Type: image/jpeg'); // Output the image imagejpeg($im); // Free up memory imagedestroy($im); 一起加入所有相关表。