假设自动生成的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);
,那么我们只是使用复合自然键,并且可能完全摆脱代理键。
我在使用自然键之前已经完成了这项工作并且运行良好。但由于代理键似乎受到青睐,我想知道如果设计选择会如何完成。
答案 0 :(得分:2)
从用户的角度来看,第一个绑定到sn
而第二个绑定到model: B; sn: 01
是最直观和现实唯一可行的选择。假设我的设备有id: 3
。我将无法知道我的设备也是id: 3
,除非有一些贴纸将其指定为3
或我收到model
是设备编号的通知。但sn
和(id)
始终由制造商放置在设备上。
从数据库的角度来看,任一关键都有效。密钥(model, sn)
和id
都唯一地标识设备。 CHAR
是多余的,是真的,但它可以在相关表中用作表约束以减少总DB大小(序列号可能很大,需要是(model, sn)
的变体)并简化加入了查询。
(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);
一起加入所有相关表。