我认为主键可以分为两种,一种是无意义的主键,例如News表中的NewsID主键,目的只是为了唯一标识一条记录,如果数据表中去掉这个主键字段,该表中的信息也是完整的,也就是说该字段对用户是透明的,用户理不理解都无所谓;一种是有意义的主键,比如Orders表中的OrderNO主键,这个表是离不开OrderNO这个字段的,这个字段已经成为业务实体的一部分了,这在做系统分析的时候就已经确定了,它对用户来说是可理解的,甚至是需要记忆的。
有意义的主键是需要自己写程序或者建立专门的数据表来生成的,而且生成的规则也是在系统分析的时候就确定好的;对于无意义的主键则根本没有这个必要,下面我列出了一个流程步骤来说明怎样给数据表分配一个主键:
1、数据表一定要有主键,该主键可以是一个或者多个呵呵,废话一句
2、数据表的主键选择首先在该数据表自有的字段中找,依据是该字段或者字段组合可以唯一的标识一条记录,好像也是废话
3、如果在自有字段中实在找不到可以唯一标识一条记录的字段或者字段组合(例如News表)时,需要给表增加一个主键字段,这个增加的主键是无意义的。
4、如果找到一个字段可以唯一的标识一条记录,则该表的主键则为这个字段(例如Orders表),这个主键就是有意义的
5、如果找到一个字段组合可以唯一的标识一条记录,则分为以下两种情况
6、如果该数据表不需要与其他的表进行数据主-外键关联,则该表的主键则为这个字段组合,这个字段组合的主键也是有意义的
7、如果该数据表表需要与其它表产生主-外键关联,这时候也要增加一个主键字段,而把找到的那个字段组合作成唯一索引,原因是多字段主键没法与其它表建立数据关联,这个增加的主键是无意义的。
8、无意义的主键类型在自增的int与guid中选择,选择的依据是是否该数据现在或者以后需要进行表分布,需要分布就选择guid,否则就选择自增int,原因是自增的int没法进行表分布
对于无意义的主键,我不赞成自己生成主键的做法,也没有这个必要,无论是用一个“主键表”或者什么“COMB”类型,或者其它的做法,并发问题,生成效率问题,分布问题。。。。。