一个基础问题

来源:互联网 发布:mysql 字段替换字符串 编辑:程序博客网 时间:2024/06/06 08:44

用sql server设计了一个表,其中有一个人的身份证的信息,我想以身份证号为主键,可以吗?

可是网上看到的资料说,主键不应该人为给定的,应该由计算机自动生成,貌似就是自增的意思。

可以用身份证号码作为主键,反正不会出现冲突就好了。
网上的说法,或许只是建议使用自增列作为主键。

遇到一个结论,思考一下为什么。各种方案,只要是可行的,便没有对错,只有优劣。自己理解了,才能根据自己的情况灵活选择。


主键:逻辑概念。一个主键唯一地决定表中的一条记录。一个表只能有一个主键。
聚集索引:物理概念。聚集索引决定表中数据的物理存储结构,同时也是最高效的查询途径。一个表只能有一个聚集索引。

通常主键会默认为聚集索引。但这不是必须的。主键和聚集索引是两回事,一定分清楚。

选择自增标识列或GUID为主键
优点:1. 可由计算机自动生成,方便。2. 定长字段,而且通常为整数,占用空间小。
缺点:缺乏直观的意义,只能作为系统内部的标识。
示例:ERP系统的订单号、BBS系统的用户号和帖子号。

选择预定义编码为主键
优点:编码具有直观意义,方便使用。
缺点:1. 编码需要专门生成和维护。2. 有意义编码通常是字符串类型,占用空间较大。
示例:公安部国民信息系统的身份证号、邮政系统的邮编号、电信系统的电话号码。

选择思路
1. 如果一个表的数据量和数据变化不大,使用频率高,且不需要太多索引(聚集索引键影响非聚集索引的空间大小),则考虑选择预定义编码。
如员工工号、部门编号,使用E0001、D1-2的编码就比使用12345、67890这样的标识列更直观、易用。
如日历表显然是以日期为主键,号段地区表显然是以号段为主键,这种情况下添加一下自增标识列完全吃力不讨好,既浪费空间又降低性能。

2. 如果一个表的数据是在业务运行中不断生成,数据量和数据变化比较大,或者需要建多个索引,则考虑使用内部定义主键(标识列)。
如ERP系统的订单号,专门编制有意义的编码既费力又没有意义。
如图书馆系统或网上书店的图书表,往往采用内部定义主键(整数标识列),使用ISBN固然可以,但由于图书需要多种查询方式,需要在书名、作者、出版社+出版年、ISBN等多个字段上建索引,如果主键太大会浪费空间影响性能。
选择主键(以及聚集索引),不光要从技术上考虑,也要从系统业务角度考虑。

从逻辑上说,一个表是一种事物(事或物的统称)的集合,一个主键即是一个该类事物的唯一标识。

如果要表示一个国家的人,以身份证号(社会保险号等)作为主键是必然。
如果要表示世界上的人,则需要以国家码+该国国民身份编号作为主键。
如果只是表示一个企业的员工,用身份证号则不太有必要,不如制订一个企业内部员工编号。但设计编码要考虑业务变化和未来兼容性,比如当两个企业合并以后,员工编号要怎么处理。
全国身份证号是有重复的,不能作为主键,不用怀疑身份证号没有重复的啊,可以用来做主键!

身份证号有重复?除非是造假吧。

支持做主键,不过要看你的实际需求,表的结构。

LZ说说的自增的是设置了标识列 作为标识列后就能自动增长 比如标识种子是1 标志增量也是1那么你插入的数据ID自动生成就一次为1 2 3 ...

身份证号码可以作为主键 因为身份证号是唯一的  
主键可以由一个字段,也可以由多个字段组成,分别成为单字段主键或多字段主键。
来源:足球直播

原创粉丝点击