У меня есть отношение "многие ко многим" между выпусками и артефактами, когда данный выпуск связан с несколькими артефактами, а данный артефакт связан с несколькими выпусками.
Я понимаю, как смоделировать это:У меня есть таблица releases
со столбцом идентификатора:
CREATE TABLE releases (
release_uuid uuid PRIMARY KEY
);
и таблица artifacts
со столбцом идентификатора:
CREATE TABLE artifacts (
artifact_uuid uuid PRIMARY KEY,
hash bytea
-- other data
);
и соединительная таблица release_artifacts
, которая имеетстолбцы внешнего ключа от каждого из остальных:
CREATE TABLE release_artifacts (
id serial PRIMARY KEY,
release_uuid uuid REFERENCES releases(release_uuid) NOT NULL,
artifact_uuid uuid REFERENCES artifacts(artifact_uuid) NOT NULL,
UNIQUE (release_uuid, artifact_uuid)
);
Что я хочу сделать, так это найти релиз, «содержащий» заданный набор артефактов, чтобы я мог предупреждать о дублированных выпусках.То есть, для артефактов A1
, A2
и A3
, какой релиз (ы) Rx
определяется именно этими тремя артефактами?Более наглядно, учитывая таблицу release_artifacts
:
release ID | artifact ID
-----------+------------
R1 | A1
R1 | A2
R1 | A3
R2 | A4
R2 | A2
R2 | A3
, какой поиск я могу выполнить с A1
, A2
, A3
в качестве ввода, которое вернет мне R1
?Поиск по A2
, A3
вернет NULL
.Или мне нужна другая модель?Я предполагаю, что было бы проще, если бы таблица release_artifacts
отображала выпуск в массив идентификаторов артефактов, но тогда я теряю ссылочную целостность с таблицей artifact
.
Мне не нужна максимальная производительность илимаксимальная защита от параллелизма, но я был бы рад, если бы эти вещи не увеличили сложность запроса.Это в базе данных Postgres 9.6, хотя я бы посчитал, что это версия версии.