Предположим, у меня есть таблица со столбцами:
- person_id (первичный ключ)
- имя
- фамилия
- день рождения
У меня также есть уникальное ограничение на комбинацию {first_name, last_name} (я знаю, что у большего количества людей может быть одно и то же имя, но я хочу, чтобы мой пример был простым). Я хочу знать, находится ли эта таблица в третьей нормальной форме.
Мои рассуждения (до РЕДАКТИРОВАТЬ):
- Все поля могут содержать только атомарные значения, поэтому таблица находится в первой нормальной форме.
- Ключи-кандидаты: 1) person_id, 2) [first_name, last_name]
- Единственным непростым атрибутом является день рождения.
- День рождения атрибута функционально не зависит от части ключа-кандидата 1 (что в любом случае невозможно, поскольку в ключе-кандидате 1 есть только 1 атрибут).
- День рождения атрибута функционально не зависит от части ключа-кандидата 2.
- Следовательно, эта таблица находится во второй нормальной форме.
- День рождения атрибута (есть/нет) нетранзитивно зависит от ключа-кандидата 1
- День рождения атрибута нетранзитивно зависит от ключа-кандидата 1.
Вопрос (перед РЕДАКТИРОВАТЬ):
Вопрос, на который я не могу ответить, заключается в том, не транзитивно ли день рождения зависит от person_id. Функционально между этим идентификационным номером и днем рождения нет никакой связи.
- Означает ли это, что существует транзитивная зависимость (день рождения зависит от [first_name, last_name], и каждая комбинация [first_name, last_name] сопоставляется с идентификатором) и, следовательно, не в 3NF?
- Означает ли это, что зависимости нет вообще, а значит, и не в 3NF?
- Я неправильно истолковываю сложный язык, и эта таблица находится в 3NF?
Мои рассуждения (после РЕДАКТИРОВАТЬ):
- Если вы знаете person_id, вы знаете его имя, фамилию и день рождения, поэтому есть FD {person_id} -> {first_name}, {person_id} -> {last_name} и {person_id} -> {dayday}.
- Если вы знаете имя и фамилию человека, вы знаете его person_id и день рождения, поэтому есть FD {first_name, last_name} -> {person_id} и {first_name, last_name} -> {birthday}.
Если вы знаете день рождения человека, вы ничего не знаете о его person_id или имени, поэтому нет FD от дня рождения до другого (набора) атрибута (ов).
Все поля могут содержать только атомарные значения, поэтому таблица находится в первой нормальной форме.
- Ключи-кандидаты: 1) {person_id}, 2) {first_name, last_name}
- Единственным непростым атрибутом является {день рождения}.
- Атрибут {день рождения} не является ФД на части СК 1 (что в любом случае невозможно, так как в СК 1 всего 1 атрибут)
- Атрибут {день рождения} не является FD в части CK 2
Следовательно, эта таблица находится во второй нормальной форме.
Существует ФЗ {person_id} -> {день рождения}, поэтому атрибут {день рождения} нетранзитивно зависит от СК 1
- Существует ФЗ {имя, фамилия} -> {день рождения}, поэтому атрибут {день рождения} нетранзитивно зависит от СК 2
- Следовательно, эта таблица находится в третьей нормальной форме.
Есть зависимость {person_id} -> {first_name, last_name} -> {день рождения}, но так как есть и прямая зависимость {person_id} -> {день рождения}, эта зависимость не является транзитивной.
Вопрос (после РЕДАКТИРОВАТЬ):
У меня нет предопределенного набора FD из книги, поэтому я не уверен, верны ли FD. Может ли кто-нибудь подтвердить это или, если они выглядят не так, показать, как я могу найти FD в этом практическом примере?
Третье рассуждение (второе РЕДАКТИРОВАТЬ):
FD's:
- If you only know a person's person_id, you know his first name, last name and his birthday (there cannot be multiple people with the same person_id)
- FD: {person_id} -> {first_name}
- FD: {person_id} -> {last_name}
- FD: {person_id} -> {день рождения}
- Расширения, включающие {person_id}, больше не нужно учитывать.
- If you only know a person's first_name, you don't know any other field of this person (there can be multiple people with the same first_name)
- Not FD: {first_name} -> {person_id}
- Не FD: {first_name} -> {last_name}
- Не FD: {first_name} -> {день рождения}
- If you only know a person's last_name, you don't know any other field of this person (there can be multiple people with the same last_name)
- Not FD: {last_name} -> {person_id}
- Не FD: {last_name} -> {first_name}
- Не FD: {last_name} -> {день рождения}
- If you only know a person's birthday, you don't know any other field of this person (there can be multiple people with the same birthday)
- Not FD: {birthday} -> {person_id}
- Не FD: {день рождения} -> {first_name}
- Не FD: {день рождения} -> {last_name}
- If you know a person's first_name and last_name, you know his person_id and his birthday (there cannot be multiple people with the same first_name and last_name)
- FD: {first_name, last_name} -> {person_id}
- FD: {имя, фамилия} -> {день рождения}
- Расширения, включающие {first_name, last_name}, больше не нужно учитывать.
- If you know a person's first_name and birthday, you don't know any other field of this person (there can be multiple people with the same first_name and birthday)
- Not FD: {first_name, birthday} -> {person_id}
- Не FD: {имя, день рождения} -> {фамилия}
- If you know a person's last_name and birthday, you don't know any other field of this person (there can be multiple people with the same last_name and birthday)
- Not FD: {last_name, birthday} -> {person_id}
- Не FD: {фамилия, день рождения} -> {имя}
Нормальные формы:
Все атрибуты могут содержать только одиночные значения, поэтому таблица находится в первой нормальной форме.
Глядя на FD, есть два ключа-кандидата: 1) {person_id}, 2) {first_name, last_name}
- Единственным непростым атрибутом является {день рождения}.
- Атрибут {день рождения} не является ФД на части СК 1 (что в любом случае невозможно, так как в СК 1 всего 1 атрибут)
- Атрибут {день рождения} не является ФД на части СК 2 (т.е. нет ФД {имя} -> {день рождения} или ФД {фамилия} -> {день рождения})
Следовательно, эта таблица находится во второй нормальной форме.
S транзитивно определяет T, когда существует такое X, что S -> X и X -> T и не (X -> S)
- Пусть S = CK1 = {person_id} и T = {день рождения}. Единственный X такой, что S -> X и X -> T, это когда X = {first_name, last_name}. Однако тогда выполняется и X -> S. Следовательно, S нетранзитивно определяет T.
- Пусть S = CK2 = {имя, фамилия} и T = {день рождения}. Единственный X такой, что S -> X и X -> T, это когда X = {person_id}. Однако тогда выполняется и X -> S. Следовательно, S нетранзитивно определяет T.
- Следовательно, эта таблица находится в третьей нормальной форме.