主键与ID

  默认的主键为ID,我们可以如下来修改主键,

 

 

  class LegacyBook < ActiveRecord::Base
     self.primary_key = "isbn"
    end

     ActiveRecord会负责为你创建的每条记录新建主键值,他们是递增的整数,但不保证连续,然而,如果我们指定了主键字段,就必须同时负责将每条新记录的主键设为唯一的值,我们仍旧可以通过名为 id 的属性来设置主键值。也就是说,只要使用 ActiveRecord,主键字段在对象中的属性名称永远都是 id,primary_key=声明只是用于指定数据库表中的主键字段。

### 随机主键 ID 的生成方法 #### UUID 利用 UUID 的 128 位随机性保证全局唯一性。在 Java 中可以使用如下代码生成 UUID: ```java import java.util.UUID; public class Order { private String id = UUID.randomUUID().toString(); // 生成 UUID private String orderNo; // Getter & Setter } ``` UUID 格式为 `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`,存储时可压缩为 16 字节二进制存储(Base128 编码),示例代码如下: ```java import java.nio.charset.StandardCharsets; import java.util.UUID; public class UUIDCompressor { public static byte[] compressUuid(String uuid) { return UUID.fromString(uuid).toString().getBytes(StandardCharsets.UTF_8); } } ``` 这种方法无需协调生成 ID,完全随机,适用于分布式系统 [^3]。 #### 数据库自增主键加随机因素 当采用自动生成主键 ID 方案时,可以通过为每张分表设定不同的起始点和步长来避免 ID 冲突。例如,如果有 10 张分表,则可以设置每张表的起始主键 ID 从 1 到 10,步长均为 10。这种方法简单易行,但适用于分表数量较为固定的情况 [^1]。 ### 随机主键 ID 的使用场景 #### 分布式系统 在分布式系统中,不同的服务或节点需要生成唯一的 ID。UUID 完全随机,无依赖数据库,非常适合用于分布式系统中生成唯一的主键 ID [^3]。 #### 分库分表场景 在分库分表的情况下,原来的数据库自增 id 作为主键不能满足业务需求,需要有一个在分库分表中的唯一标识 id 作为主键。随机主键 ID 可以保证在不同的库和表中生成的 ID 是唯一的 [^4]。 #### 对数据安全性要求较高的场景 随机主键 ID 不能通过主键看出业务信息,满足信息安全的要求,适用于对数据安全性要求较高的场景 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值