处理Heroku/ClearDB auto Increment 主键策略

Handling Heroku/ClearDB auto Increment primary key strategy

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

我的问题是,您如何在代码中处理此问题。例如,假设我有一个 status table 由 4 行组成,

     id | name
     1  | Active
     2  | Retired
     3  | Banned
     4  | Awaiting Mod

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

   if($status['id'] == 1){
     //do something
   }else{
     // do something else
   }

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

我应该按名称检查,例如,if($status['name'] == 'Active') 还是向 table 添加一个新列,其中包含我需要的 int?我知道在 SQL 中通过 int 查询比通过 string.

查询要快得多

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

基本上有两种策略可以解决这个问题

没有自动递增

不要使用自增。插入数据时,只需自己添加 id 值。对于像 'status' 这样的 table,它可能只包含静态数据,您不会动态更改,这可能是个不错的选择。

字符串常量

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

class YourClass {
  const ACTIVE = 'Active';
  const RETIRED = 'Retired';
  ...
}

然后把支票写成

if($status['name'] == self::ACTIVE){
  //do something
}

我建议使用第二种方法,主要是因为它使您的代码更语义化。 $status['name'] == self::RETIRED$status['id'] == 2

更容易理解

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