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

主键有必要建索引吗?
今天看老大的数据库,他把每个表的primary key都建了一个unique index,我记得数据库理论里面讲过,主键会被自动建索引,那么还有必要建吗?
跑到老大那儿问去了,结果被一句“这个是经过时间考验的,这样用有它的好处”给撞回来了,老大也不说有什么好处,好是郁闷,还有个问题,为了安全,他的每个数据表当中都有一个operator和operator_date字段,这两个字段存最后一个更改该数据表当中数据的人的id和时间,我觉得这样的话冗余挺多的,而且只能存最后一个人更改的记录,还不如另建一张表,又不敢继续问,在这里求大家解释解释

------解决方案--------------------
个人认为:没必要,完全没必要,建主键时本身就有了

而且如果在oracle中,对于主键列本身就有索引,如果再建会直接报错
------解决方案--------------------
1. 如果只是建立在主键上面,那是没有必要的。
2. operator和operator_date 还是很有用的,看看后面是不是还有什么触发器,会把数据写入到其他表格。
------解决方案--------------------
我给一些个人的看法吧。仅仅限定在SQLServer。
1、他把每个表的primary key都建了一个unique index:在SQLServer中,primary key一定是unique index。因为主键不可能不唯一,这是最起码的常识。并且SQLServer的主键默认就是聚集索引,但是根据我个人工作经验,往往聚集索引光是主键那(那些)列是不够的,经常要添加一些时间列。这个要看具体的数据访问。
2、对于【operator和operator_date字段】,其实还是要看具体需求,如果业务上或者安全性上不太过在乎每个人的操作明细,那么完全可以只记录最后一笔,这样没必要分表。但是如果像银行那种账户进出明细,就有必要做一个明细表来记录了。有些业务对操作明细很注重,所以需要分表,有些仅仅是一种冗余记录,可以没必要注重那么细节。这方面你要结合你们公司的情况具体去体会。不是你们老大的就一定对,我很欣赏你的好问。继续努力。
------解决方案--------------------
“为了安全,他的每个数据表当中都有一个operator和operator_date字段,这两个字段存最后一个更改该数据表当中数据的人的id和时间,”
这种做法是为了以后维护起来方便;如果出问题,直接可以找到最后操作该记录的人;楼主多操练几次就明白了
------解决方案--------------------
把每个表的primary key都建了一个unique index,这个认为没有没多大必要。

至于每个数据表当中都有一个operator和operator_date字段,这两个字段存最后一个更改该数据表当中数据的人的id和时间,这个我觉得是有必要的,可以记录数据库操作对象和时间,有利于需要时确定相应人员