编号序列生成的 ID - 解决我可能出现的最坏情况的有效方法



我的设置:

Mysql 和 PHP

系统场景:

我有超过 10 种类型的系统用户:例如:客户和员工

每次将客户或员工添加到系统时,系统都会根据当前日期自动生成每个用户的 ID。

例如(客户):

今天是2015年6月20日,该客户是第三个注册的客户。所以他的ID将是06202015-03。因此,每次用户(任何类型的用户)注册时序列号将仅在一天内递增 1。每隔一天序列计数器将返回到 0。

一般问题:鉴于我对 ID 生成的担忧已解决,预处理下一个序列 # 是否是一种好的做法?我的意思是系统只会拉出保存在数据库表上的下一个序列号?还是我应该只处理下一个序列号,直到新用户注册?

更新(添加了最佳可能方案):

示例日期:2015 年 6 月 20 日

  1. 客户 1 注册 = 生成的 ID 将为 06202015-01

  2. 客户 2 注册 = 生成的 ID 将为 06202015-02

    等等...

注册期间最糟糕的情况:

  1. 2 个或更多用户以模拟方式注册
  2. 如果客户 1
  3. 在同一天被删除(由管理员)并且客户 2 注册,则客户 2 应获得 #1 ID (06202015-01),而不是 *-02,因为客户 1 已被删除。

.

我想知道有效生成序列号的最佳方法:

  1. 存储过程是否最适合此? 还是我应该使用 #2?(见下文
  2. 每次用户注册时只处理下一个序列号(使用 PHP 函数)是否是一种好的做法?

#2 过程是我认为处理自动 ID 生成的最佳和更简单的方法,但我在想如果 2 个或更多用户怎么办同时唱歌?

在我的最新更新中,顺序显然是可以预测的。我唯一关心的是获取序列号的最佳或有效方法是什么。它是通过存储过程还是在所述最坏的情况下使用 php 脚本函数。

一般问题:鉴于我对 ID 生成的担忧已解决,预处理下一个序列 # 是否是一种好的做法?我的意思是系统只会拉出保存在数据库表上的下一个序列号?还是我应该只处理下一个序列号,直到新用户注册?

如果 ID 取决于用户注册的日期,则无法预测下一个 ID,因为您不知道下一个用户何时注册(除非您是千里眼)。

为了更容易地获取下一个值,我将 id 分成两列,一列包含日期,一列包含序列,然后您可以使用:

IFNULL((SELECT MAX(sequence) FROM usertable WHERE signup_date = CURRENT_DATE), 0) + 1

Imo没有最佳实践,这是个人喜好。还有第三个选项,插入前触发器。

为避免重复,请添加包含两列的唯一索引。

此外,您还可以锁定表:

LOCK TABLES user_table WRITE;
/* CALL(sproc) or INSERT statement, or SELECT and INSERT statements */
UNLOCK TABLES;

使用写锁定,在释放锁之前,没有其他会话可以访问该表(它将等待)

相关内容

  • 没有找到相关文章

最新更新