Структура базы данных: Как определить уникальность ключа в таблице на основе таблицы «прародителя»? - PullRequest
0 голосов
/ 13 марта 2020

Трудно express озаглавить вопрос, так как мне не хватает терминологии того, чего я хочу достичь, поэтому я напишу это с точным примером того, что я хочу сделать.

Имея эти таблицы:

Table market{
  id integer [pk]
  code varchar(32) [not null, unique]
  name varchar(32) [not null]
}

Table outcome{
  id integer [pk]
  market integer [not null, ref: > market.id]   # References market
  code varchar(32) [not null, unique]
  name varchar(32) [not null]
}

Table game{
  id integer [pk]
  match integer [not null, ref: > match.id]     # References match
  outcome integer [not null, ref: > outcome.id] # References outcome
  odd float [not null]
  status integer [not null, ref: > status.id]
  won bool [null]
}

Как можно добавить уникальный ключ в таблицу game, гарантируя, что только outcome на market на match («отношение прародителя») not null значение?

Например

market table
-------------------+
id | code | name   |
-------------------+
1  | vict | Victory|
1  | goal | Goals  |
-------------------+

outcome table
------------------------------------+
id | market | code | name           |
------------------------------------+
1  | 1      | home | Home           |
2  | 1      | away | Away           |
3  | 2      | one  | One            |
4  | 2      | two  | Two            |
5  | 3      | thmr | Three or More  |
------------------------------------+

game table
-------------------------------------------+
id | match | outcome | odd | status | won  |
-------------------------------------------+
1  | 1     | 1       | 1.2 | 1      | NULL |
2  | 1     | 2       | 2.5 | 1      | 1    | // OK
3  | 2     | 1       | 1.7 | 1      | 1    | 
4  | 2     | 2       | 2.4 | 1      | 1    | // ERROR
-------------------------------------------+

1 Ответ

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

Большинство баз данных позволяют фильтровать уникальные индексы или что-то подобное.

create unique index unq_game_market_match
    on game(market, match)
    where outcome is not null;

В тех случаях, когда это не так, вы можете сделать нечто подобное с вычисляемыми столбцами и / или функциональными индексами.

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