Heroku运行ClearDB作为MySQL层,主键以10的倍数自动递增。因此,例如,第一个插入可以是4然后是14,24,34等。我完全接受他们的推理,所以这不是问题。
我的问题是,你如何在代码中处理这个问题。例如,假设我有一个status
表,其中包含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')
还是要在表格中添加一个新列,其中包含我需要的int
?我知道SQL中的int
查询比string
快得多。
那么,正常处理这个问题的方法是什么?
答案 0 :(得分:3)
基本上有两种策略来处理
不要使用自动增量。在插入数据时,只需自己添加id值。对于像'status'这样的表,它可能只包含静态数据,你不会动态改变,这可能是个不错的选择。
检查字符串值。并将这些字符串定义为类常量。
class YourClass {
const ACTIVE = 'Active';
const RETIRED = 'Retired';
...
}
然后将支票写为
if($status['name'] == self::ACTIVE){
//do something
}
我建议使用第二种方法,主要是因为它使您的代码更具语义性。比$status['name'] == self::RETIRED
$status['id'] == 2
的含义
如果您在该表的name
列上添加索引,则在按名称而不是按主键进行查询时,性能不会有(几乎)任何差异。