Ограничение на два внешних ключа - PullRequest
1 голос
/ 09 июля 2019

Я создал базу данных для хранения точек данных в подходе ACID.Одна таблица содержит сами точки данных и имеет внешний ключ к источнику данных.Существует несколько источников для каждого географического местоположения, поэтому у меня есть еще одна таблица для этих мест.Из источников данных у меня есть внешний ключ в этих местах, и все хорошо.

Теперь мой начальник попросил меня создать новый столбец в данных датчика, чтобы также связать его с местоположением для упрощения отладки и повышения производительности.Но я все еще хочу, чтобы база данных проверила, что будет невозможно вставить точку данных для определенного источника данных и местоположения, где источник и местоположение не совпадают.
Было бы еще лучше, если база данныхбудет автоматически генерировать идентификатор местоположения на основе предоставленного sourceid.

Данные :

ID | SrcID | LocID | MoreColumns
---+-------+-------+------------
 1 |     1 |     1 |           X - OK
 2 |     1 |     2 |           X - Bad, DataSource is not at location 2
 3 |     4 |     4 |           X - Bad, Location 4 doesn't exist, but is caught by FK-Constraints

Src :

ID | LocID | MoreColumns
---+-------+------------
 1 |     1 |           X
 2 |     1 |           X
 3 |     2 |           X

Loc :

ID | MoreColumns
---+------------
 1 |           X
 2 |           X

Как мне достичь согласованности данных здесь?
С FK проверяется, существуют ли Loc и Src, но как я могу убедиться, что местоположение, котороеданные указывают на то же местоположение, на которое указывает их источник?

1 Ответ

0 голосов
/ 10 июля 2019

Я решил проблему, сделав первичный ключ в Src составным первичным ключом (ID, LocID), а затем добавив внешний ключ от Data из (SrcID, LocID) к этому первичному ключу в Src (ID, LocID).
.для Src выданы уникальные ID s Я создал еще один уникальный индекс для ID в Src.
Внешний ключ от Src к Loc остается без изменений.

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