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 к вашему примеру предлагает две возможности:
- Иметь
Person
таблица с идентификаторами, а затемStudent
и т. д. с внешними ключами к нему. - Наличие единой таблицы для всего, с некоторыми дополнительными полями, чтобы различать разных людей.
Теперь, если ваша оценка привела вас к предпочтению 1, вы можете заметить, что в Django это может быть достигнуто с помощью конкретной модели наследования (это то же самое, что вы описали выше). В этом случае, во что бы то ни стало, используйте наследование, если вы найдете в Django более элегантные шаблоны доступа.
Поэтому я не говорю, что вы не должны использовать наследование, я говорю, что вы должны смотреть на него только после того, как вы смоделировали свои данные с точки зрения SQL. Если бы вы сделали это в приведенном выше примере, вы бы никогда даже не подумали разбить все на отдельные таблицы, в которых есть все отмеченные вами проблемы, как предполагает абстрактная модель наследования.