hibernate的应用,一定需要主键的。
很多书上或网页都推荐针对hibernate的表设计时,设计一个独立的主键id,跟业务逻辑无关系的。但是我在实际应用中,发现有些业务涉及主外时,使用跟业务逻辑有关的主键很方便。
我的经验:
1、使用自增流水号 作为主键 少用复合主键
比如 a表是一个复合主键表 b参照a 那么b必须也有那两个
2、自增主键 可以优化查询
因为主键是自增的 所以比如查询时 可以带上 最后一次的id 这样查询效率会提高不少
3、复合主键 改成唯一索引 进行约束即可
4、好切分
比如我要分表 如果简单的话 可以直接根据id 取模划分 简单 而且 均匀
我的经验是相反的,不要和业务挂上钩,好些。特别是hibernate这种自动化程度高的。
因为业务是会变的。比如
现在说这个表每天只可能有一条数据,于是主键用'yyyyMMdd'了。
可是例外发生了,一天可以有多条,于是主键就得改,改主键就比较麻烦。特别是如果还有外键带着,一团糟!
所以我推荐和业务脱离,如果业务要求严格。
宁可用制约(最后也程序中处理,除非该应用偏向DB。)代替,也别绑上主键等。
比如说支付宝订单表,用订单号做主键,理论上完全可以,但不推荐,不到万不得已的时候不要用(比如复合主键)。业务逻辑主键引入库表,使得底层数据库表和业务逻辑想耦合,之后业务逻辑的变动很可能对底层数据库结构产生连带影响,在某些情况下,这种变更的代价难以承受