保留票务系统问题的记录ID

时间:2010-09-28 20:29:07

标签: php postgresql

好的,我们有一个用PHP / PostgreSQL开发的自定义票务系统。 它现在的工作原理是输入信息,点击提交,显示票号。 他们想要什么,显示门票号码,输入信息,点击提交。

现在我知道我可以创建一个空白记录并使用该记录ID,然后在用户提交时进行更新。

我想知道这样做是否会有更好/替代的方式?

一些关键点:

  • 记录ID是pk,自动递增
  • 记录ID必须按顺序排列,不得跳过记录ID号

问题是最终用户可以启动故障单ID过程而不是单击提交,这将导致空白记录。这可能是最好的方法。

任何想法或这是最好的方法吗?

编辑: 我理解所有的抱怨以及我需要做些什么来完成所请求的操作,看起来我只是在处理空白记录。它不应该经常发生,但我想看看以前是否有人必须处理这个问题。感谢您的输入

4 个答案:

答案 0 :(得分:3)

  

记录ID必须按顺序排列,不得跳过记录ID号

存在一个问题:当用户1开始购票时,他会得到例如数字234,之后用户2也开始一张票并获得数字235,但是当用户1取消他的票时,则跳过数字234

好的,你可以在保存之前再次检查,但是你有问题,在机票开头显示的号码可能不是最终号码......

p.s。:我还没有看到任何票证系统在创建新票证开始时向您显示最终票号...

答案 1 :(得分:2)

没有切实可行的方法。

锁定表或使用事务是不谨慎的,因为应用必须等待其他用户输入。这意味着带有信息的门票之间会有间隙。这对客户来说是一个愚蠢的要求。你的经理应该做得更好,解释为什么以后获得票号是最佳选择(比赛条件):

获取下一个自动增量ID需要访问资源。这意味着必须对该资源进行控制。想象一下在熟食店实施这种方法。一个人拿一个数字来决定他们想要什么。另一个人试图抓住一个数字。你必须以某种方式阻止它们(锁定表)或者如果第一个人离开你的号码可能会出现故障!这当然是经营企业的愚蠢方式。如果第一个人决定不订购任何东西,他应该能够把票扔掉(你有超过40亿张票 - 甚至可以增加票 - 所以你会没事的。)

答案 2 :(得分:0)

没有跳过票号的要求让我认为票号基本上是您生成的票证必须落入的有效值范围。如果是这种情况,我建议将您的记录的PK与票号分开并设置一个单独的票证预订表,该表基本上对具有时间戳的票号进行锁定。空白记录在第一次到达时被插入并绑定到预订,在超时期限到期后锁定,或者在超时期限到期后进入废弃状态,并且未来的请求将获取票号。

希望有所帮助。

答案 3 :(得分:-1)

除非您使用新列存储HiLo

,否则您可以执行Hi-Lo Algorithm之类的操作,但这会取消您的第二个关键点

你也可以不依赖于记录ID,而是使用哈希算法或那种在行中可以是唯一的东西。

否则你可以使用未完成的门票或创建一个清除未完成门票的cron作业。

  1. 像旧表一样创建新表
  2. 将旧表格中排除空白记录的所有数据插入新表格
  3. 使用新表的名称
  4. 更新表
  5. 放下旧桌子
  6. 下拉变量以确定在桌面上查询时使用哪个表(烦人,我知道)
  7. 虽然这个代码很糟糕,但它确实可以大规模地工作。