处理Heroku/ClearDB自动增量主键策略

11

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

我的问题是,如何在代码中处理这个问题。例如,假设我有一个包含4行的status表,

     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'),还是在表中添加一个新列来获取所需的ints?我知道在SQL查询中按int查询比按string查询快得多。

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

1个回答

3

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

无自增

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

字符串常量

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

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

然后按照以下方式编写你的检查:

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

我建议使用第二种方法,主要是因为它使您的代码更具语义性。很容易看出$status['name'] == self::RETIRED意味着什么,而不是$status['id'] == 2
如果您在表上为name列添加索引,则按名称查询和按主键查询时几乎没有性能差异。

非常好的答案。我想我最终会实现两种策略。一个非增量表,配合一个映射到语义代码引用的类。谢谢。 - Doug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接