Можно ли создать отношение «многие ко многим», используя таблицу перекрестков с таблицей перекрестков
Я хочу создать 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)