Моделирование данных: использовать серию BOOL или 1 ENUM? - PullRequest
1 голос
/ 31 марта 2011

Скажем, у меня есть таблица, которая называется "медиа" для представления аудио, изображений и видео.Кроме того, скажем, мне нужно различать типы носителей.Что лучше:

TABLE: media
 - media_id
 - is_audio (BOOL)
 - is_image (BOOL)
 - is_video (BOOL)

ИЛИ

TABLE: media
 - media_id
 - type (ENUM: "audio", "image", "video")

Что если бы было 1000 типов носителей?Я делю модель на 2 таблицы:

TABLE: media
 - media_id
 - media_type_id

TABLE: media_type
 - media_type_id
 - name*
  • ПРИМЕЧАНИЕ: скажем, на самом деле нет необходимости знать «имя» типа носителя (например, вам нужно знать, что это изображение, ноне волнует, что это JPG).

1 Ответ

1 голос
/ 31 марта 2011

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

С третьим вариантом, если столбец mediaTypeId имеет внешний ключ к таблице MediaType, вы гарантируете целостность данных (если только вы не используете разновидность SQL, которая не применяет внешние ключи, такую ​​как SQLite или MySQL с механизмом MyISAM).

Вы не получите этого с вашим первым решением - потенциально вы можете иметь запись в этой таблице, в которой для is_audio и is_image установлено значение 1. Кроме того, когда вы добавляете больше типов медиа, ваша таблица становится шире, уродливее и громче.

Ваш второй вариант (с использованием перечислений), кажется, специфичен для MySQL (что нормально, если вы никогда не планируете использовать что-либо кроме MySQL). Со страницы документации на самом деле это строковый тип (который излишне, но немного занимает больше места, чем целое число), и добавление новых опций кажется очень болезненным (см. этот вопрос), Кроме того, если вы хотите, чтобы другие таблицы ссылались на типы носителей, все они должны иметь свои собственные перечисления.

Я бы выбрал третий вариант, который более переносим, ​​и позволяет другим таблицам ссылаться также на MediaType.

...