Обработка стратегии автоматического увеличения первичного ключа Heroku/ClearDB

Если 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'), или я должен добавить новый столбец в таблицу с требуемыми ints? Я знаю, что запросы с помощью int в SQL намного быстрее, чем с помощью string.

Итак, каков обычный способ справиться с этим?


person Doug    schedule 12.05.2017    source источник


Ответы (1)


В основном есть две стратегии, чтобы справиться с этим

Нет автоинкремента

Не используйте автоинкремент. Просто добавьте значения идентификатора самостоятельно при вставке данных. Для такой таблицы, как «статус», которая, вероятно, содержит только статические данные, которые вы не меняете динамически, это может быть хорошим вариантом.

Строковые константы

Проверьте строковые значения. И определите эти строки как константы класса.

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

А затем выпишите свои чеки как

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

Я бы рекомендовал использовать второй подход, в основном потому, что он делает ваш код более семантичным. Намного легче понять, что означает $status['name'] == self::RETIRED, чем $status['id'] == 2

И если вы добавите индекс в столбец name в этой таблице, не будет (почти) никакой разницы в производительности при запросе по имени, а не по первичному ключу.

person simon.ro    schedule 20.05.2017
comment
Отличный ответ. Я думаю, что в конечном итоге я реализую обе стратегии. Неинкрементная таблица с классом, который сопоставляется с семантической ссылкой на код. Спасибо. - person Doug; 22.05.2017