Модель Django - выбор по сравнению с внешним ключом?

Я понимаю, что в Django ORM не поддерживает тип ENUM в MySQL или PostgreSQL, поскольку это изначально было расширением MySQL, а не переносимым по другим типам БД. Таким образом, два варианта - использовать аргумент "выбор" для вашей модели или использовать ссылку на внешний ключ.

Каковы плюсы и минусы этих подходов?

Что-то вроде пола, я предполагаю, что вы будете использовать "выборы", например:

GENDER_CHOICES = (
    ('M', 'Male'),
    ('F', 'Female'),
)
...
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

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

state = models.ForeignKey(AustralianState)

В каких обстоятельствах вы могли бы использовать один против другого?

Cheers, Виктор

Ответы

Ответ 1

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

Ответ 2

Я бы использовал варианты, в которых выбор не менялся со временем. Если бы они были, FK с новой моделью был бы лучше.

Ответ 3

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

Заметное исключение - где я бы использовал выбор вместо таблицы поиска - это объект поиска, значения которого контролируют логику на уровне кода. Это часто встречается у сущностей "status" или "type" (например, BillingType), где логика зависит от значения поля "type". В этих случаях код обычно ссылается на явные идентификаторы (коды) этих типов, и добавление нового типа потребует логических изменений (в коде) в любом случае.