Плюсы и минусы отказа от использования ForeignKey в сквозной таблице Django?
Я работаю над проектом Django и столкнулся с паттерном проектирования, в котором я не уверен. У меня есть промежуточная таблица (сквозная таблица), которая связывает Book и Tag. Вместо того чтобы использовать поля ForeignKey для связей, таблица использует обычные поля IntegerField для хранения идентификаторов связанных моделей (book_id и tag_id).
Вот как выглядит модель:
class BookTagType(models.Model):
book_id = models.IntegerField(null=True, blank=True)
tag_id = models.IntegerField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = "book_tag_types"
managed = False
В этой модели хранятся только идентификаторы Book и Tag, но мне интересно:
Есть ли какая-нибудь причина или преимущество не использовать здесь ForeignKey вместо IntegerField?
Каковы потенциальные недостатки или преимущества использования IntegerField для этих отношений по сравнению с использованием ForeignKey?
Есть три причины, которые я могу придумать:
- Referential Integrity: Если связанная модель (например,
Book
) будет удалена,IntegerField
будет ссылаться на несуществующую строку. Это может привести к повреждению БД, с которым придется кошмарно бороться... - Indexs: Django автоматически индексирует
ForeignKey
поля. Подавляющее большинство отношений FK должны иметь индекс, поэтому вам придется вручную добавлять их самостоятельно .
- ORM Features:
ForeignKey
поля обеспечивают удобный доступ к связанным моделям, и они делают написание запросов намного проще. Например, поиск по FK обычно выглядит следующим образом:name=book_tag_type.book.name
, но при использованииIntegerField
ваш запрос становится таким:name=Book.objects.get(pk=book_tag_type.book_id).name