У меня 3 таблицы:
NETWORK_OPERATOR
s;NETWORK_CELL
s: каждый из них принадлежит одномуNETWORK_OPERATOR
;IRI
s: каждый из них может иметь либо:- a Network Operator or
- Сетевая ячейка
но одно из 1) и 2) является обязательным.
В случае 1) netOpId
должен существовать в NETWORK_OPERATOR
таблице;
В случае 2) _7 _ + _ 8_ должен существовать в CELL
таблице;
Вот пример кода DDL:
CREATE TABLE "NETWORK_OPERATOR" (
"NETOPID" INTEGER NOT NULL,
"NAME" VARCHAR2(20),
CONSTRAINT "NETWORK_OPERATOR_PK" PRIMARY KEY ("NETOPID")
)
CREATE TABLE "NETWORK_CELL" (
"CELLID" INTEGER NOT NULL,
"NETOPID" INTEGER NOT NULL,
"NAME" VARCHAR2(20),
CONSTRAINT "NETWORK_CELL_PK" PRIMARY KEY ("CELLID"),
CONSTRAINT "CELL_NETOPS_FK" FOREIGN KEY ("NETOPID") REFERENCES "NETWORK_OPERATOR" ("NETOPID")
)
CREATE TABLE "IRI" (
"IRIID" INTEGER NOT NULL,
"NETOPID" INTEGER,
"CELLID" INTEGER,
"NAME" VARCHAR2(20),
CONSTRAINT "IRI_PK" PRIMARY KEY ("IRIID"),
CONSTRAINT "IRI_NETOPS_FK" FOREIGN KEY ("NETOPID") REFERENCES "NETWORK_OPERATOR" ("NETOPID")
)
Другими словами,
NETWORK_CELL
сам всегда привязан к NETWORK_OPERATOR
, так что ЕСЛИ a IRI
имеет netOpId
, он должен быть принудительно существующим netOpId
, ELSE IF a IRI
имеет cellId
+ netOpId
он должен быть существующим _19 _ + _ 20_
Я вижу 2 варианта:
Вариант 1:
Сделать только IRI.NETOPID NOT NULL
able и добавить составной FK
CREATE TABLE "IRI" (
...
"NETOPID" INTEGER NOT NULL,
"CELLID" INTEGER,
...
CONSTRAINT "IRI_CELL_FK" FOREIGN KEY ("CELLID", "NETOPID") REFERENCES "NETWORK_CELL" ("CELLID", "NETOPID")
)
(конечно, на "NETWORK_CELL" ("CELLID", "NETOPID")
будет уникальный ключ)
Другими словами, IRI будет иметь обязательную связь FK с оператором сети и необязательную связь FK с сетевой ячейкой.
Подозрительно то, что этот необязательный FK состоит из обязательного поля и необязательного поля на стороне IRI.
Oracle RDBMS принимает это (я только что пробовал), но насколько это хорошая практика?
Вариант 2:
Тот же FK, что и в варианте 1, но оставьте IRI.NETOPID
равным NULL и добавьте настраиваемое ограничение, которое применяет либо netOpId
, либо _26 _ + _ 27_
Я считаю это решение более портативным, но, возможно, ошибаюсь.
Вопрос
Есть варианты получше?
Как лучше всего справиться с этой ситуацией и почему? Я тоже думаю о переносимости на другие СУБД ...
Спасибо