2016-02-23 3 views
0

В настоящее время я создаю простое приложение в Django и пытаюсь обосноваться на хорошем дизайне модели.Использование моделей вместо выбора для перечислений в Django

Первый подход

В Django documentation и многие blog posts я читал, аргумент choice ключевое слово рекомендуется. Это будет осуществляться в моей (упрощенном) модели существительного так:

class Noun(models.Model): 
    FEMININE = 0 
    MASCULINE = 1 
    NEUTER = 2 
    COMMON = 3 
    GENDER_TYPE = (
     (FEMININE, "Feminine"), 
     (MASCULINE, "Masculine"), 
     (NEUTER, "Neuter"), 
     (COMMON, "Common"), 
    ) 
    stem = models.CharField(max_length=200) 
    gender = models.IntegerField(choices=GENDER_TYPE, default=Noun.COMMON) 

Второго подход

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

class Gender(models.Model): 
    short_name = models.CharField(max_length=1) # M, F, N, or C 
    description = models.CharField(max_length=20) # Masculine, Feminine, Neuter, or Common 

class Noun(models.Model): 
    stem = models.CharField(max_length=200) 
    gender = models.ForeignKey(Gender, on_delete=models.CASCADE) 

Я пытаюсь взвесить все относительные достоинства каждого подхода. Вот про и против я могу различить:

Первый подход

  1. Герметичная
  2. Нет необходимости импортировать модель «Пол»
  3. Не требует дополнительного шага заполнения значений перечисления в база данных
  4. Легче читать в коде: мне не нужно смотреть в базу данных, чтобы увидеть действительные значения

Второй подход

  1. Гораздо более гибким: Я могу изменить все женские слова мужской в ​​один шаг, или добавить новый пол без необходимости модифицировать таблицу существительного
  2. Логика предписана ограничение внешнего ключа, а не код, сохраняя целостность данных

Итак, мой вопрос: Я пропустил что-то очевидное о том, почему один подход недействителен? Если оба подхода действительны, какой подход лучше?

+3

Я думаю, что оба подхода действительны, и лучший выбор зависит от ситуации. Если вы не измените свой выбор в будущем, я бы определенно пошел с подходом «ForeignKey». – ilse2005

ответ

2

Оба подхода действительны. Чтобы решить одно, вы должны рассмотреть в основном два момента: сколько у вас вариантов и насколько они будут изменяться в будущем.

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

В случае с полом, я бы выбрал выбор. Даже если они изменятся в будущем - существующие, скорее всего, не будут затронуты.

+0

Спасибо за отзыв - оба ответа, похоже, говорят одно и то же. Я полагаю, что мое воздействие на БД заставляет меня не желать сохранять целостность данных только на уровне приложений, но опять же, Keep It Simple. – brianpck

1

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

  1. Если список вариантов может расти со временем будет легче иметь его в качестве Gender модели.
  2. Если список вариантов, несомненно, постоянный - используйте gender поле с choices атрибут. Это сэкономит вам время на то, чтобы сделать запрос ненужной модели Gender.
Смежные вопросы