Подтвердить что ты не робот

Enum vs Reference table vs Lookup class

Пока я создаю базу данных MySQL для сайта знакомств, я пришел с сомнением в том, как хранить данные, на которые ссылаются. В настоящее время в базе данных имеется 33 таблицы, и на них нужно ссылаться почти на 32 разных поля. Мы также должны учитывать, что многие из этих элементов необходимо перевести.

После нескольких высказываний я почти отклонил использование enum, например:

CREATE TABLE profile (
  'user_id' INT NOT NULL,
 ...
  'relationship_status' ENUM('Single','Married') NOT NULL,
 ... 
);

И обычно я бы использовал таблицу ссылок, например:

CREATE TABLE profile (
  'user_id' INT NOT NULL,
 ...
  'relationship_status_id' INT NOT NULL, 
 ... 
);

CREATE TABLE relationship_status (
  'id' INT NOT NULL,
  'name' VARCHAR(45) NOT NULL,
  PRIMARY KEY ('id') 
);

Но для создания 32 таблиц может быть слишком забито, поэтому я рассматриваю возможность его кода в PHP следующим образом:

class RelationshipStatusLookUp{
  const SINGLE = 1;
  const MARRIED = 2;

  public static function getLabel($status){
      if($status == self::SINGLE)
         return 'Single';
      if($status == self::MARRIED)
         return 'Married';
      return false;
  }
}

Как вы думаете? Поскольку я предполагаю, что это может улучшить производительность запросов, а также упростить разработку всего сайта.

Спасибо.

4b9b3361

Ответ 1

Определенно хорошая идея избегать ENUM IMHO: почему ENUM является злом. Технически таблица поиска будет предпочтительным решением, хотя для простых значений будет работать класс PHP. Вы должны быть осторожны с этим по тем же причинам, что и ENUM; если значения в вашем наборе растут, это может стать трудным для поддержания. (Как насчет "совместного проживания", "развода", "гражданского партнерства", "овдовевшего" и т.д.). Также нет тривиального запроса списков значений с использованием классов PHP; это возможно с помощью рефлексии, но не так просто, как простой MySQL SELECT. Вероятно, это один из тех случаев, когда я не буду беспокоиться о производительности, пока это не станет проблемой. Сначала используйте лучшее решение для своего кода/приложения, а затем оптимизируйте, если вам нужно.

Ответ 2

поля enum представляют некоторые проблемы:

  • Как только они установлены, их нельзя легко изменить

    'relationship_status' ENUM('Single','Married') NOT NULL,
    

    в настоящее время необходимо добавить "Гражданское партнерство" в этой стране

  • Вы не можете легко создать раскрывающийся список опций из списков перечисления

Однако данные в базе данных могут быть подвергнуты ограничениям ссылочной целостности, поэтому использование ссылки внешнего ключа в справочной таблице дает вам такую ​​степень проверки без ограничений перечисления.

Поддержание параметров в классе требует изменения кода для любых новых параметров, которые необходимо добавить к данным, что может увеличить работу, связанную с вашими процедурами выпуска, и не предотвращает вставки плохих данных в базу данных.

Лично я бы пошел для справочной таблицы

Ответ 3

Во-первых, вам не нужны id и relationship_status_id в таблице Relationship_status.

Лично я хотел бы использовать перечисление, если вам не нужно связывать больше данных, чем просто имя статуса отношений с человеком (или если вы планируете увеличить его в будущем). Это будет намного проще, если вы посмотрите на базу данных, чтобы узнать, что, если она находится на легко читаемом языке, а не запрашивать вторую таблицу.

Когда вы рассматриваете производительность, убедитесь, что быстрее запросить таблицу по уникальному идентификатору, но вы должны отслеживать это отношение, и вы всегда будете объединяться в несколько таблиц для получения одинаковых данных. Если решение enum заканчивается медленнее, я не думаю, что этого будет достаточно, чтобы человеческий мозг мог воспринимать разницу даже при больших наборах данных.