MYSQL:主键

主键的作用:要唯一的定位到一条数据.

使用自增主键还是自己指定主键要看项目是单机系统还是分布式系统。

如果是单机的,自增主键完全没有问题。

如果是分布式的,一般在业务层自己生成全局唯一id,插入到数据库。

下面是详细的说明。

目录

业务字段做主键

自增字段做主键

手动赋值主键


业务字段做主键

用业务字段做主键,看起来很简单,但是我们应该尽量避免这样做。因为我们无法预测未来会不会因为业务需要,而出现业务字段重复或者重用的情况。

以业务字段做主键还有一个后果就是,索引的叶子结点中的内容占用空间可能会比较大,一个页面可能能放入的数据更少了。

自增字段做主键

自增字段做主键,对于单机系统来说是没问题的。但是,如果有多台服务器,各自都可以录入数据,那就不一定适用了。因为如果每台机器各自产生的数据需要合并,就可能会出现主键重复的问题。

1. 既然门店客户端能够更新总部数据库为啥还要把数据放到本地呢。

==> 主要原因是门店的网络状况不稳定,为了支持断网销售,所以先把数据存在本地

2. 每次插入数据都要去总部管理信息表获取ID,插入后还要更新总部管理信息表,这个管理信息表会导致资源争用,在数据并发请求高的时候肯定会出现阻塞或者更新失败的情况吧。

==>添加会员操作的频率还是比较低的,出现阻塞的风险不大

==>如果是多个门店同时添加会员信息?那么这些门店查询的max_id是一样的

==>需要用事物,防止别的连接读取到错误的信息

3. 主键使用varchar类型,使用UUID 或者雪花ID 生成随机字符串做主键是不是更好一点呢。

==>UUID,雪花ID都是不错的办法,但是实施成本比较高,

手动赋值主键

我们可以采用手动赋值的办法,通过一定的逻辑,确保字段值在全系统的唯一性,这样就可以规避主键重复的问题了

为了解决这个问题,我们想了一个办法:取消字段“id”的自增属性,改成信息系统在添加会员的时候对“id”进行赋值。

具体的操作是这样的:在总部 MySQL 数据库中,有一个管理信息表,里面的信息包括成本核算策略,支付方式等,还有总部的系统参数,我们可以在这个表中添加一个字段,专门用来记录当前会员编号的最大值。

门店在添加会员的时候,先到总部 MySQL 数据库中获取这个最大值,在这个基础上加 1,然后用这个值作为新会员的“id”,同时,更新总部 MySQL 数据库管理信息表中的当前会员编号的最大值。

这样一来,各个门店添加会员的时候,都对同一个总部 MySQL 数据库中的数据表字段进行操作,就解决了各门店添加会员时会员编号冲突的问题,同时也避免了使用业务字段导致数据错误的问题。

==>手动赋值做主键的例子里面直接通过获取总部的会员表的最大会员id之后再在门店会员表中添加会员信息就可以吧,没有必要单独把总部会员的最大id记录到一个单独的参数表中???

作者回复: 这样的话,如果门店会员信息没有及时汇总到总部,就会出现会员编号重复的问题了。

猜你喜欢

转载自blog.csdn.net/lamanchas/article/details/121366812