Php 数字序列生成的ID-解决可能出现的最坏情况的有效方法

Php 数字序列生成的ID-解决可能出现的最坏情况的有效方法,php,mysql,function,datetime,stored-procedures,Php,Mysql,Function,Datetime,Stored Procedures,我的设置: Mysql和PHP 系统场景: 我有10多种类型的系统用户: 例如:客户和员工 每次向系统添加客户或员工时,系统将根据当前日期自动为每个用户生成ID 前客户: 今天是2015年6月20日,该客户是第三位注册的客户。所以他的 ID为06202015-03。所以每次用户注册任何类型的用户 序列号仅在一天内递增1。隔天 序列计数器将返回到0 一般问题:考虑到我对ID生成的关注已经解决,预处理下一个序列是否是一个好的做法?我的意思是,系统将只拉出保存在db表上的下一个序列号?或者我应该只处理

我的设置:

Mysql和PHP

系统场景:

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

每次向系统添加客户或员工时,系统将根据当前日期自动为每个用户生成ID

前客户:

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

一般问题:考虑到我对ID生成的关注已经解决,预处理下一个序列是否是一个好的做法?我的意思是,系统将只拉出保存在db表上的下一个序列号?或者我应该只处理下一个序列号,直到新用户注册

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

示例日期:2015年6月20日

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

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

等等

注册期间可能出现的最坏情况:

2个或多个用户同时注册 如果管理员在同一天删除了customer1,并且customer2已注册,则customer2应获得1 id 06202015-01,而不是*-02,因为customer1已被删除。

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

存储过程是否最适合这种情况?还是应该使用2?见下文 每次用户注册时使用PHP函数处理下一个序列号是否是一种好的做法? 2进程是我认为处理自动ID生成的最好和更简单的方法,但是我想如果2个或更多的用户 同时唱起来

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

一般问题:考虑到我对ID生成的关注已经解决,预处理下一个序列是否是一个好的做法?我的意思是,系统将只拉出保存在db表上的下一个序列号?或者我应该只处理下一个序列号,直到新用户注册

如果id取决于用户注册的日期,则无法预测下一个id,因为除非你是透视者,否则你不知道下一个用户何时注册

为了更容易获得下一个值,我将id分为两列,一列带有日期,一列带有序列,然后u可以使用:

IFNULL((SELECT MAX(sequence) FROM usertable WHERE signup_date = CURRENT_DATE), 0) + 1
在我看来,没有最佳实践,这是个人偏好。 还有第三个选项,插入前触发器

为避免重复,请使用两列添加唯一索引

此外,您还可以锁定表:

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

使用写锁,在释放锁之前,其他会话无法访问该表。它将等待

如果在给定的一天有100人注册怎么办?这是个坏主意。只需存储日期和唯一的用户id。@草莓。。不,我的意思是不是大约有100人报名。我最不关心的是:假设两个人同时注册?问题是何时在一天内获得正确的下一个序列号。我已经更新了我的帖子。@草莓是正确的。不要这样做。只需按照数据库的工作方式创建一个唯一的id号,然后将其他属性存储在一个表中即可。此外,不存在“同时”。一个会先于另一个-你可以阅读并发性,当然你可以做你想做的事。然而,我要提醒的是,需求规范通常不应该指定串联PK的结构——这应该是一个实现细节。更新我的帖子以回答您的问题。可以预测一天内的下一个序列号。