Можно ли создать отношение «многие ко многим», используя таблицу перекрестков с таблицей перекрестков

Я хочу создать m2m-отношение между двумя таблицами, и одна из таблиц является таблицей-перекрестком для m2m-отношения. То есть, по сути, у меня есть 3 таблицы, и две из них могут быть объединены с помощью m2m. Но для того, чтобы соединить три таблицы, у меня есть два варианта, один из них - создать m2m с третьей таблицей и уже созданной таблицей соединения, а другой подход - создать таблицу, которая имеет внешний ключ всех трех таблиц. Какой из вышеперечисленных подходов подходит.

Два подхода к реализации таблицы по отношению к трем таблицам таковы:

CREATE TABLE PromoPrizeScreen (
    id SERIAL PRIMARY KEY,
    prize_cap INTEGER DEFAULT NULL,
    prize_used INTEGER DEFAULT NULL,
    promo_prize_id INTEGER NOT NULL,
    screen_id INTEGER NOT NULL,
    FOREIGN KEY (promo_prize_id) REFERENCES PromoPrize (id) ON DELETE CASCADE,
    FOREIGN KEY (screen_id) REFERENCES Screen (id) ON DELETE CASCADE
);



CREATE TABLE PromoPrizeScreen2 (
    id SERIAL PRIMARY KEY,
    prize_cap INTEGER DEFAULT NULL,
    prize_used INTEGER DEFAULT NULL,
    promo_id INTEGER NOT NULL,
    prize_id INTEGER NOT NULL,
    screen_id INTEGER NOT NULL,
    FOREIGN KEY (promo_id) REFERENCES Promo (id) ON DELETE CASCADE,
    FOREIGN KEY (prize_id) REFERENCES Prize (id) ON DELETE CASCADE,
    FOREIGN KEY (screen_id) REFERENCES Screen (id) ON DELETE CASCADE
);

Я реализую это на Django, поэтому вот модели django:

class PromoPrizeScreen(models.Model):
    id = models.AutoField(primary_key=True)
    prize_cap = models.IntegerField(default=None)
    prize_used = models.IntegerField(default=None)
    promo_prize = models.ForeignKey(PromoPrize, related_name='promo_prize_screens', on_delete=models.CASCADE)
    screen = models.ForeignKey(Screen, related_name='promo_prize_screens', on_delete=models.CASCADE)

class PromoPrizeScreen2(models.Model):
    id = models.AutoField(primary_key=True)
    prize_cap = models.IntegerField(default=None)
    prize_used = models.IntegerField(default=None)
    promo = models.ForeignKey(Promo, related_name='promo_prize_screens', on_delete=models.CASCADE)
    prize = models.ForeignKey(Prize, related_name='promo_prize_screens', on_delete=models.CASCADE)
    screen = models.ForeignKey(Screen, related_name='promo_prize_screens', on_delete=models.CASCADE)



Вернуться на верх