Опираясь на ваши комментарии с paxdiablo. , .
Давайте посмотрим на некоторые SQL. Я мог бы выбрать лучшие имена для столбцов, но я сознательно не сделал. Я не был ленивым; У меня были веские причины. Внешний предикат - это то, как пользователи должны интерпретировать содержимое таблицы.
-- External predicate: Human is identified by
-- Social Security Account Number [ssan]
-- and has full name [full_name]
-- and result of last HIV test [hiv_status]
-- and has checking account [bank_account]
-- and was born at exactly [birth_date].
--
create table human (
ssan char(9) primary key,
full_name varchar(35) not null,
hiv_status char(3) not null default 'Unk'
CHECK (hiv_status in ('Unk', 'Pos', 'Neg')),
bank_account varchar(20),
birth_date timestamp not null
);
-- External predicate: Human athlete identified by
-- Social Security Account Number [ssan]
-- has current doping status [doping_status]
create table athlete (
ssan char(9) not null primary key references human (ssan),
doping_status char(3) not null default 'Unk'
CHECK (doping_status in ('Unk', 'Pos', 'Neg'))
);
-- External predicate: Human dictator identified by
-- Social Security Account Number [ssan]
-- has estimated benevolence of [benevolence_score].
create table dictator (
ssan char(9) not null primary key references human (ssan),
benevolence_score integer not null default 3
CHECK (benevolence_score between 1 and 5) -- 1 is least, 5 is most benevolent
);
Все три из этих таблиц в 5NF. (Это означает, что они также в 3NF.)
Вы сказали
нет отношения "есть" в
реляционная база данных
Спортсмен "Я" человек, потому что его идентификатор - это человеческий идентификатор. В этом случае его первичным ключом является внешний ключ, который references human (ssan)
. Разработчики баз данных обычно не говорят в терминах отношений «IS A» и «HAS A», потому что предикаты являются более точными и выразительными. Вы можете увидеть разницу, сравнив эти два утверждения.
- человек "ИМЕЕТ" [дата рождения]
- человек родился именно в
[Birth_date]
Этот последний намеренно немного сотрясает. Я определил столбец birth_date как метку времени - он содержит как дату, так и время. Это показывает, как внешние предикаты в некоторой степени независимы от имен столбцов. (Это также показывает, что слабая связь между предикатами и именами столбцов может быть не очень хорошей идеей).
Вы сказали
Но теперь вы все равно получите чистого ЧЕЛОВЕКА
но только дети ЧЕЛОВЕКА
Я не уверен, что вы подразумеваете под "чистым человеком". Вы можете получить всех людей, просто
SELECT * FROM human;
Если вы имеете в виду, что у вас не может быть человека, если человек не является спортсменом или диктатором (или чем-то еще), тогда вы ошибаетесь. Если в спортсмене нет строки для определенного SSAN, то человек, идентифицированный этим SSAN, не является спортсменом. Если в диктаторе нет строки для определенного SSAN, то человек, идентифицированный этим SSAN, не является диктатором.