关于sql中逻辑主键和业务主键的理解

本文探讨在使用Hibernate过程中遇到的联合主键问题。原项目使用联合主键,但转换到Hibernate时面临挑战。解决方案是引入逻辑主键和业务主键的概念,逻辑主键用于机器识别记录,业务主键帮助理解项目设计。举例说明了如何将联合主键改造成单一主键,以适应Hibernate并保持与原有系统兼容。
摘要由CSDN通过智能技术生成

1背景 :在使用hibernate的过程中,遇到了联合主键的困境。

由于原有项目是原生的java语言写的,而现在需要使用hibernate重写。原有的数据库表的设计中,很多表中都是用了联合主键 ,因为这样的设计符合业务上的概念,而且原生的jdbc数据库访问也不存在使用联合主键的困难。

但是,现在一切变了,一方面,我们享受者hibernate的面向对象的变量;一方面,却要忧虑不能使用hibernate的原有功能时的无所是从。

我在网上搜集了一些讨论,结论是除非你真的精通hibernate,否则不要使用hibernate的联合主键功能,因为这会给你带来很多意外的烦恼。幸好,以前的项目也是我写的,因此,

我决定把数据库改了,原来正在运行基于原生java语言开发的项目也响应更改。


2  因此接下来要讨论如何改的问题,如何能够尽量不影响原来项目的运行,而又能以最小的工作量解决当前项目的困境呢,这就牵涉到了本文要讨论的概念了,

  逻辑主键和业务主键—— 我的理解如下

逻辑主键---通俗的说,是给机器的,它的目的是让机器能够正确标识记录

业务主键----是给人(程序员)来理解的,它的目的是让我们更好的理解项目的设计思想,以便于开发。

举个例子:我原来的项目中 有2个表 

sh_device 主键  dev_GUID

sh_maintain  主键  ma_dev_GUID, ma_order

在sh_maintain  中,使用了联合主键,其中ma_dev_GUID关联了sh_device的dev_GUID,

ma_order 表示在某一个设备下的维修记录顺序号比如 1,2,3...,是一个局部的值。在不同的dev_GUID下可以重复。

这里 的ma_dev_GUID和ma_order就可以理解为业务主键,因为它表示了我们的设计意图

现在,使用hibernate开发时,由于使用联合主键实施开发时有困难,需要把联合主键改为 单一主键。

因此,可以为sh_maintain 增加一个字段 比如ma_GUID作为主键, 用来唯一标示记录,原来的2个字段的主键标识取消,但是保留这2个字段的,以便原来的程序能继续运行。这个ma_GUID就可以认为是逻辑主键,虽然它不如以前的双主键更清晰的表达设计意图,但是却能够让机器更好的执行。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值