Модель Джанго для таблицы против модели за выбор - PullRequest
1 голос
/ 07 сентября 2010

Я работаю с Django некоторое время, и теперь, когда мое «дерево» и вся БД заполнены данными (примечание: существующая база данных), мне было интересно, действительно ли «одна модель на таблицу» на данный момент лучше, чем"одна модель на выбор".

У меня есть одна таблица - objtree.Здесь хранятся все узлы (бренды, категории, теги и т. Д.).Как вы можете себе представить, он интенсивно используется в моей администрации.Сегодня мне пришлось добавить еще один внешний ключ для другой таблицы, но у меня уже есть 2 внешних ключа.Проблема в том, что я использую эту модель практически для всего, НО внешние ключи используются редко, не говоря уже о третьем, который будет использоваться один раз.Поскольку в каждой из этих таблиц содержится не менее 20 тыс. Строк, а внешние ключи используются редко, мне интересно, не лучше ли использовать «один класс модели на выбор» - по скорости .

Повлияет ли этот подход на скорость?До сих пор это работало нормально для меня (модель на таблицу), но разве это не излишество для такой большой базы данных?

Любое мнение приветствуется.

С уважением

Редактировать:

Вот модель.3 внешних ключа нужны редко, но, как и сейчас, они выбираются в любом случае, даже если они мне не нужны (возможно, есть простой способ указать, какой из них я не хочу использовать при выполнении, например, Model.objects.all()).

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

class Objtree(models.Model):
  node_id = models.AutoField(
    primary_key = True
  )
  type_id = models.IntegerField()
  parent_id = models.IntegerField()
  sort_order = models.IntegerField(
    null = True, 
    blank = True
  )
  name = models.CharField(
    unique = True, 
    max_length = 255, 
    blank = True
  )
  lft = models.IntegerField()
  rgt = models.IntegerField()
  depth = models.IntegerField()
  added_on = models.DateTimeField()
  updated_on = models.DateTimeField()
  status = models.IntegerField()
  point_to = models.IntegerField(
    null = True, 
    blank = True
  )
  node = models.ForeignKey(
    'Objtree_labels', 
    verbose_name = 'Objtree_labels', 
    to_field = 'node_id'
  )
  specs = models.ForeignKey(
    'OptionSpecs', 
    verbose_name = 'OptionSpecs', 
    db_column = 'node_id', 
    null = True, 
    blank = True
  )
  ct = models.ForeignKey(
    'CategoryTemplate',
    verbose_name = 'CategoryTemplate',
    db_column = 'node_id',
    to_field = 'group_id',
    null = True,
    blank = True
  )

1 Ответ

3 голосов
/ 07 сентября 2010

Мне было интересно, действительно ли «одна модель на таблицу» на данный момент лучше, чем «одна модель на выбор».

Что такое «модель на выбор»?Похоже, ваша модель неверна.

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

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

Нет разумной альтернативы «модели на таблицу».Вопросы, которые вы должны задать: «Что я моделирую?»"Что это за объект реального мира?"И "Каково описание этой вещи в реляционной базе данных?"


если было бы лучше иметь, скажем, 3 модели, где я бы использовал внешние ключи соответственно?

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

Однако основные вопросы все еще остаются.

  • Что это? Это три разные вещи? Это три аспекта одной вещи? Это не технические вопросы, а вопросы реальности.Не беспокойтесь о производительности.Не беспокойтесь о моделировании реальности с большой точностью.

  • 'Objtree_labels', 'OptionSpecs', 'CategoryTemplate' - что это за объекты в реальном мире?Метки - обычно не существуют в реальном мире.Спецификации опций могут быть чем-то осязаемым.Шаблон категории не похож на реальную вещь.

Повлияет ли это на скорость?

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

Но если эти три значения действительно независимы - три разные вещи -они должны быть в отдельных таблицах, чтобы отражать тот факт, что это разные вещи.

...