Плюсы и минусы отказа от использования 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
Вернуться на верх