一个表有多个主键效率高,还是只有一个主键效率高。
比如表TableA,有字段userId,ClassId,通过UserId和ClassId就可以确定记录的唯一性。在此时我有没有必要再增加一个 tableAId的字段呢?
如果不增加的话,表的主键就有两个UserId和ClassId
如果增加的话,userid和classId就不是主键。主键就是tableAId.
老实说,就个人看来增加一个tableAId这种方法要习惯一点,可是现在有人在项目上提出来不增加的设计方法。两种方法肯定都能够满足需求,但关键是什么方法效率高一点?因为查询的话,肯定是不通过主键来查询的,是通过UserId和classId来查询。
------解决思路----------------------
这应该叫代理主键,有没有其它业务需要引用到这个关系,没有的话,就用复合主键吧,有的话,用代理主键也是可以的,在那种复合主键很多的情况下,用代理更好。
------解决思路----------------------
从效率上来讲,一个表的栏位越少,那么存入缓存的数据行数就越大,那么读取的时间就会越短,效率就会越高。
而从主键来讲,主键列越少,列的数据类型越窄,相同情况下,存入缓存的索引数据量就越大,读取时间也会缩短,效率也会越高。
这是两个相悖的命题,所以,只有你自己的实际情况多做测试。
还有就是个人习惯问题,有人喜欢加代理主键,有人喜欢用复合主键。
单纯从效率来说的话,我觉得复合主键会好些,毕竟如果你建立代理主键,为了查询效率的优化,你还要建立userid和classid对应的索引,多一道工序,多一个索引,对新增和修改有一定性能影响。
------解决思路----------------------
我自己记录的一些笔记
逻辑主键:采用与业务无关的唯一性的字段做主键,或称之为“伪主键”
业务主键:把具有实际含义的字段作为主键
逻辑主键的好处:1,因为具有业务含义的列都有修改的可能性(比如员工号,产品编号等等),
如果有其他表引用该字段作为外键,要引起级联修改,
消除主键(业务字段)修改引起的一致性问题
2,业务主键可能由多个列组成(比如上班打卡记录,由员工号+日期组成),
这样的话,如果有其他表引用该表的主键做外键,需要存储多个字段,造成存储空间的扩大
消除业务主键由多个字段组成引起的冗余存储
3,如果是复合主键的话,会造成一些业务无法实现,
比如有多个字段作为主键,在应用中只有这些字段全部输入后才能呢个保存,
现实中有些功能是“保存草稿”状态的,也就是说必填字段可以在没有填写的情况下实现保存,
如果不采用逻辑主键的话,此功能就无法实现
4,应用程序中不方便,比如像查询一个对象的明细信息,如果采用业务主键,可能需要传递多个参数才能确定一条数据(更方便地实现业务功能)
业务主键的好处:1,不需要逻辑键的冗余存储,
2,可以直接根据业务主键确认一条数据
------解决思路----------------------
关于什么情况下“冗余”,这个我觉得才真正有必要做探讨
增加一个逻辑主键,看似多存储了一个字段,表面上看称之为冗余,但是你再进一步,加入有其他表引用这个主键作为外键,同时要存储两个字段的(外键),现在看,上面的冗余反而是节省了空间
但是再反过来说,我这个表就是独立存在的,没有跟其他表有关系,那么存储一个逻辑主键就显不合适了,谁也用不到它啊
很多问题不是一棒子可以拍死的,看情况
------解决思路----------------------
+1