PostgreSQL проверка столбцов связанных таблиц - PullRequest
0 голосов
/ 01 марта 2020

У меня есть эта структура таблицы (она похожа на Python / SQLAlchemy, но я считаю, что это почти псевдокод):

class Sport:
    id = Column(Integer, primary_key=True)

class Team:
    id = Column(Integer, primary_key=True)
    sport_id = Column(Integer, ForeignKey('sports.id')) # relationship to Sport

class League:
    id = Column(Integer, primary_key=True)
    sport_id = Column(Integer, ForeignKey('sports.id')) # relationship to Sport

class Match:
    id = Column(Integer, primary_key=True)
    team_home_id = Column(Integer, ForeignKey('teams.id')) # relationship to Team
    team_away_id = Column(Integer, ForeignKey('teams.id')) # relationship to Team
    league_id = Column(Integer, ForeignKey("leagues.id")) # relationship to League

Я хотел бы ввести некоторое ограничение на совпадения (или триггер et c.) чтобы все Team s и League имели одинаковые связанные Sport.

Что SQL мне нужно выдать в моей БД для создания такой проверки или, в идеале, Есть ли способ достичь этого с помощью SQLAlchemy (все классы являются производными от DeclarativeBase, я просто опустил его в коде)?

1 Ответ

1 голос
/ 01 марта 2020

Два простых варианта

  • Имеют Team, указывающие на League, а не Sport. Это может быть проблематично c, если одна и та же команда может играть в нескольких лигах (Реал Мадрид играет в футбол как в Ла Лига , так и Лига чемпионов УЕФА )
  • Имеет Match удерживайте Sport id, сделайте его частью всех трех внешних ключей. Если ваш League не имеет других полей, он становится ненужным.

Другие параметры могут включать в себя что-то вроде:

  • Создать Participation, который сообщает, какая команда участвует какая лига (возможно, в каком сезоне). Астон Вилла играл в Чемпионате 2019 года, но Премьер-лиге 2020 года. Свяжите Participation с Match es вместо Team s.

  • Только League указывают на Sport. Спарта Прага играет как в хоккей, так и в футбол. (Пришлось выбрать этот пример, так как вы, кажется, из .cz: P)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...