处理Heroku/ClearDB auto增量主键策略

Dou*_*oug 10 php mysql sql heroku cleardb

使用Heroku运行ClearDB作为MySQL层,主键以10的倍数自动递增.因此,例如,第一个插入可以是4然后是14,24,34等.我完全接受他们的推理,所以这不是问题.

我的问题是,你如何在你的代码中处理这个问题.例如,假设我有一个status由4行组成的表,

     id | name
     1  | Active
     2  | Retired
     3  | Banned
     4  | Awaiting Mod
Run Code Online (Sandbox Code Playgroud)

然后在我的应用程序中我使用:

   if($status['id'] == 1){
     //do something
   }else{
     // do something else
   }
Run Code Online (Sandbox Code Playgroud)

显然,由于PK的增加方式,这将会中断.处理这类情况的最佳做法是什么?例如,我不能检查14,因为没有什么可以说编号策略不会改为12,22,32等.

我应该按名称进行检查,例如,if($status['name'] == 'Active')或者我int是否需要在表中添加新列?我知道int在SQL中查询要快得多string.

那么,处理这个问题的正常方法是什么?

sim*_*.ro 3

基本上有两种策略来处理这个问题

没有自动增量

不要使用自动增量。只需在插入数据时自行添加 id 值即可。对于像“状态”这样的表,可能只包含静态数据,您不会动态更改,这可能是一个不错的选择。

字符串常量

检查字符串值。并将这些字符串定义为类常量。

class YourClass {
  const ACTIVE = 'Active';
  const RETIRED = 'Retired';
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后将您的支票写为

if($status['name'] == self::ACTIVE){
  //do something
}
Run Code Online (Sandbox Code Playgroud)

我建议使用第二种方法,主要是因为它使您的代码更加语义化。$status['name'] == self::RETIRED相比之下,更容易看出含义$status['id'] == 2

如果您在该表的列上添加索引,name那么当您按名称而不是主键查询时,性能不会(几乎)有任何差异。