日期:2014-05-17  浏览次数:20783 次

请问关于数据库主键的一些问题
本人小白,技术实在浅薄,说的不对的请大家指点,请不要笑话我什么都不懂,因为我真的很菜

    我到这个公司快两年了,公司内一直有个不成文的规定,就是不让使用主键(oracle的序列,sql的identity,程序自动生成max+1,借助其它表存放当前ID值,UUID,这五种都不让用),单独的表也不行,带有主子表关联的表也不行。甚至要确定一条唯一的记录时,需要四五个字段。
    这样对开发效率影响比较大,当多表关联时需要联结好多字段,分页查询时在oracle还可以,可以通过rownum分页;sql中类似这种分页语句很难写,select top N * from 表 where id not in(select top M id from 表)。
    举一个例子,有一个项目:人员表里有一列是岗位,是这样写的"技术中心\思政部\思政部主任",三层分别是公司部门岗位,完全用名字引用,当岗位修改时,除了组织机构表,这个表里的记录还要整个刷一遍;当查询岗位下的员工时,也要把公司部门岗位都查出来,拼成以“\”分隔的串,再去人员表里查。 类似这样的使用到处都是。
    现在有一个项目,主键的生成方式是:列1的值+列2的值+列3的值+列4的值,四个列的值合在一起当主键用。说是为了系统开放性。
    我问其他人,说是为了现场实施时好导数据、数据好恢复、开放性等。
    以我的对这三点理解是这样:
    我们这导数据一般方式是,现场人员用一个工具,把用户准备好的excel文件(无ID)直接导入数据库中,这样导入是没法生成ID的,只能把业务字段导进去。
    数据好恢复指的是当一些数据丢了,用excel重新导入库中即可,因为excel里没有ID字段,所以根本不需要考虑跟其他表的关联。
    开放性指的是除了程序能生成数据库记录外,用户也可以自己往数据库里导数据,由于客户不知道主键是什么东西,他们只会把业务字段写到库里。
    给我的感觉是无主键是为了迎合实施,尤其像我们公司这样,实施人员连sql都写不熟的,只会用个工具把客户的excel导到库里,然后再会个把asp.net项目部到IIS里,把java web项目部到tomcat里就没别的事了。为了实施起来容易,我们程序开发难度加大了很多,甚至有些情况根本无解(比如两条记录字段值完全一样,又没有主键,根本无法区分,虽然这样的情况很少,但确实存在风险)。。。
    我原来去过的公司对主键生成有两种方式:一个是oracle序列,一个是按规则生成。可到了这个公司,主键说什么都不让用。
    请大神指导一下,这样做真的的合理吗,为什么,所谓的好导数据、数据好恢复、开放性等分别是什么意思,实施的难度与开发的难度之间如何权衡?
数据库 主键

------解决方案--------------------
个人觉得这个是一个不合理的做法,设置主键就是为了数据的唯一性的考虑。

比如说吧,有一个用户信息表,里面有个身份id字段,在业务上这个字段是不可能重复的,其实也就是这个字段就是这个表的主键了。
向这个表插入数据的时候,你要先判断下这个身份id有米有,有的话就不插入,弹出已经存在的信息。
这样正常的情况下,表里面的数据不会出现什么问题。

但是你导入数据的时候就不一定了,当操作失误的时候可能这个表里面同一个身份id的数据有多条的时候,那你系统估计就挂了。。。

如果设置了主键的话,就不会出现这个情况了。。。

个人想法是这样的,坐等其他大神的回答吧。
------解决方案--------------------
很简单,这就是作坊式开发。

所谓的好导数据、数据好恢复、开放性你就当成放P吧。