处理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
列上添加索引,那么当您按名称而不是按主键查询时,性能(几乎)不会有任何差异。
使用 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
列上添加索引,那么当您按名称而不是按主键查询时,性能(几乎)不会有任何差异。