Виды детерминации
Распорка
Распорка - это два внешних ключа, соединяющих три таблицы:
ссылающиеся поля находятся в одной промежуточной таблице.
create table a (
id num primary key,
data float
);
create table b (
id num primary key,
ref1 num references a(id), -- important
ref2 num references a(id), -- ballast
ref3 num references c(id), -- important
ref4 num references c(id), -- ballast
data float
);
create table c (
id num primary key,
data float
);
Детерминация состоит из двух полей, перечисленных через двоеточие:
поле, ссылающееся на предыдущую секцию ("a"), указывается первым;
поле, ссылающееся на последующую секцию ("c"), указывается вторым
(ссылающиеся поля могут быть одноименными).
Синтаксис распорки состоит из трех звеньев и выглядит так:
Стяжка
Стяжка - это два внешних ключа, соединяющих три таблицы:
ссылающиеся поля ссылаются на одну промежуточную таблицу.
create table a (
id num primary key,
ref1 num references b(id), -- important
ref2 num references b(id), -- ballast
data float
);
create table b (
id num primary key,
data float
);
create table c (
id num primary key,
ref1 num references b(id), -- important
ref2 num references b(id), -- ballast
data float
);
Синтаксис стяжки состоит из трех звеньев и выглядит так:
Перекресток
Перекресток - это два внешних ключа,
соединяющих две таблицы в противоположных направлениях:
одно ссылающееся поле находится в одной таблице и ссылается на первичный ключ второй таблицы,
другое ссылающееся поле находится во второй таблице и ссылается на первичный ключ первой таблицы.
create table a (
id num primary key,
ref num references b(id),
data float
);
create table b (
id num primary key,
lnk num references a(id),
data float
);
Существуют два не эквивалентных cинтаксиса перекрестка
(каждый из двух звеньев).
Разветвление
Разветвление - это два внешних ключа, соединяющих три таблицы:
ссылающиеся поля ссылаются на одну обрамляющую таблицу
create table a (
id num primary key,
data float
);
create table b (
id num primary key,
ref1 num references a(id), -- important
ref2 num references a(id), -- ballast
data float
);
create table c (
id num primary key,
ref1 num references a(id), -- important
ref2 num references a(id), -- ballast
data float
);
(синтаксис разветвления:)
.a.(b#ref1 c#ref1). -- both "b" and "c" must exist in output
.a.(b#ref1 | c#ref1). -- either "b" or "c" must exist in output
... или ссылающиеся поля находятся в одной обрамляющей таблице
create table a (
id num primary key,
ref1 num references b(id), -- important
ref2 num references b(id), -- ballast
ref3 num references c(id), -- important
ref4 num references c(id), -- ballast
data float
);
create table b (
id num primary key,
data float
);
create table c (
id num primary key,
data float
);
(синтаксис разветвления:)
.a#ref1+ref1.(b c). -- both "b" and "c" must exist in output
.a#ref1,ref1.(b | c). -- either "b" or "c" must exist in output
Продолжение
Продолжение - это два внешних ключа, соединяющих три таблицы:
ссылающиеся поля ссылаются на две обрамляющие таблицы
create table b (
id num primary key,
data float
);
create table c (
id num primary key,
data float
);
create table d (
id num primary key,
ref1 num references b(id), -- important
ref2 num references b(id), -- ballast
ref3 num references c(id), -- important
ref4 num references c(id), -- ballast
data float
);
(синтаксис продолжения:)
.(b.d#ref1 c.d#ref3). -- both "b" and "c" must exist in output
.(b.d#ref1 | c.d#ref3). -- either "b" or "c" must exist in output
... или ссылающиеся поля находятся в двух обрамляющих таблицах
create table b (
id num primary key,
ref1 num references d(id), -- important
ref2 num references d(id), -- ballast
data float
);
create table c (
id num primary key,
ref1 num references d(id), -- important
ref2 num references d(id), -- ballast
data float
);
create table d (
id num primary key,
data float
);
(синтаксис продолжения:)
.(b#ref1 c#ref3).d. -- both "b" and "c" must exist in output
.(b#ref1 | c#ref3).d. -- either "b" or "c" must exist in output
P.S.
Если внешний ключ состоит из нескольких полей,
то в детерминации эти поля перечисляются через знак умножения.
Тюрин Дмитрий