С 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
я требую? Я знаю, что запросы int
в SQL гораздо быстрее, чем string
,
Итак, что такое нормальный способ справиться с этим?
Есть в основном две стратегии, чтобы справиться с этим
Не используйте автоинкремент. Просто добавьте значения 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
В столбце этой таблицы не будет (почти) никакой разницы в производительности при запросе по имени, а не по первичному ключу.
Других решений пока нет …