MutiTable Джанго против Абстрактное наследование

Хотя существует общее мнение о том, что наследование нескольких таблиц не очень хорошая идея в долгосрочной перспективе ( Якобиан, другие), мне интересно, могут ли в некоторых случаях "дополнительные объединения", созданные django во время запросов, стоить того.

У меня проблема с единственным источником истины в базе данных. Скажем, для Персональных объектов, которые идентифицируются с использованием Идентификационного номера и Типа идентификации. Например, идентификационный номер 222, тип паспорта.

class Person(models.Model):
    identity_number = models.CharField(max_length=20)
    identity_type = models.IntegerField()

class Student(Person):
    student_number = models.CharField(max_length=20)

class Employee(Person):
    employee_number = models.CharField(max_length=20)

При абстрактном наследовании любая модель подкласса человека, например, Студент, Родитель, Супервайзер, Сотрудник и т. Д., Унаследованная от Персонального абстрактного класса, будет иметь identity_number & identity_type хранятся в соответствующих таблицах

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

В абстрактном наследовании, чтобы сохранить дубликаты в базе данных, нужно было бы встроить дополнительную логику проверки в приложение, таким образом, также слегка снижая производительность, что означает, что оно отменяет "дополнительное объединение", которое django имеет отношение к конкретному наследованию?

1 ответ

Решение

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

Традиционный подход SQL к вашему примеру предлагает две возможности:

  1. Иметь Person таблица с идентификаторами, а затем Studentи т. д. с внешними ключами к нему.
  2. Наличие единой таблицы для всего, с некоторыми дополнительными полями, чтобы различать разных людей.

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

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

Другие вопросы по тегам