<сильный>|Х| представляет количество кортежей в X
жирным шрифтом обозначаются ключи в отношении
Рассмотрим отношения R(A, B) и S(A, C), и что R имеет внешний ключ на A, который ссылается на S.
|R ✶ S| (где '*' означает естественное соединение):
Возможные варианты:
1. |R|
2. |S|
3. |R|.|S|
4. max(|R|, |S|)
5. min(|R|, |S|)
Что я понимаю о мощности естественного соединения? что если между двумя отношениями нет общего атрибута, то естественное соединение будет действовать как перекрестное произведение, и мощность будет равна r * s. Но я не понимаю, как ключевые ограничения играют роль в определении кардинальности. Может кто-нибудь объяснить?
Найдите мощность естественного соединения
Ответы (2)
Если предположить, что полужирный шрифт A в каждой схеме означает, что это ключ; и предполагая, что ограничение внешнего ключа сохраняется, то есть значение A
для каждой строки в R
действительно соответствует значению A
в S
:
- Каждая строка в
R
естественным образом соединяется со строкой в S
наA
. - В
S
могут быть строки, которые не присоединяются кR
(поскольку для этого не существует ограничения внешнего ключа). - Таким образом, мощность соединенных отношений равна мощности
R
, ответ 1.
Есть ли реальное применение для такой схемы? Учтите, что S
— это имя клиента в C
, введенное по номеру клиента в A
. R
содержит дату рождения в B
, а также номер клиента в A
. У каждого Клиента должно быть имя; это правда, что каждый Клиент (лицо) должен иметь дату рождения, но нам не нужно записывать это, если/пока они не приобретут товары с возрастным ограничением.
Совершенно недостаточно информации для ответа на этот вопрос. «Естественное» соединение может возвращать почти любое значение от 0 до R*S. Ниже приведены примеры.
Этот пример возвращает 12:
create table s1 (id int primary key);
create table r1 (s1_id int references s1(id));
insert into s1 (id) values (1), (2), (3);
insert into r1 (s1_id) values (1), (2), (2), (3);
Этот пример возвращает 0:
create table s2 (id int primary key, x int default 2);
create table r2 (s2_id int references s2(id), x int default 1);
insert into s2 (id) values (1), (2), (3);
insert into r2 (s2_id) values (1), (2), (2), (3);
Этот пример возвращает 4:
create table s3 (id int primary key, y int default 2);
create table r3 (id int references s3(id), x int default 1);
insert into s3 (id) values (1), (2), (3);
insert into r3 (id) values (1), (2), (2), (3);
Во всех них r
имеет отношение внешнего ключа к s
. И используется «естественное» соединение. Вот скрипт db‹>.
Даже если вы предполагаете, что «А» являются первичными ключами И что других столбцов нет, количество строк все равно различается:
-- returns 4
create table s5 (id int primary key);
create table r5 (id int references s4(id));
insert into s5 (id) values (1), (2), (3);
insert into r5 (id) values (1), (1), (2), (2);
Против:
-- returns 0
create table s4 (id int primary key);
create table r4 (id int references s4(id));
insert into s4 (id) values (1), (2), (3);
insert into r4 (id) values (NULL), (NULL), (NULL), (NULL);
r
. Только один из ваших примеров имеет одинаковые имена атрибутов (внешнего) ключа между двумя таблицами. Поскольку одно и то же имя - это весь смысл Natural Join, я думаю, вы абсолютно не ответили на вопрос (даже учитывая его небрежность).
- person AntC; 11.05.2020
A
в двух схемах выделены жирным шрифтом. Значит ли это, что они являются ключами? А такжеA
вR
является внешним ключом, ссылающимся наA
вS
. Это довольно необычная схема, предполагающая, что эта схема представляет собой нормализацию 6NF того, что начиналось как одна таблица. - person AntC   schedule 11.05.2020