Как правильно построить таблицу для построения БД родственников?
Добрый день, Гуру!
Доскажите, пожалуйста, как правильно построить таблицу (может и не одну) и идентифицировать строки таблицы так, чтобы можно было строить простые запросы.
Ну, допустим, есть пользователь: Иванов Иван Анатольевич, он может быть сыном и отцом одновременно! Значит у него отец - Иванов Анатолий Максимович и есть сын - Иванов Матвей Иванович. Соответственно, у пользователя Иванова Анатолия Максимовича есть сын - Иванов Иван Анатольевич и внук - Иванов Матвей Иванович. Правило железобетонное одно - у отца всегда один сын.
Вот у меня и дилемма - как построить таблицу и как упорядочить индексы обозначающие отцов, дедов и внуков одной родственной линии, чтобы потом просто и быстро строить запросы такого рода: Вывести всех внуков основных пользователей или вывести всех тех, кто является текущим отцом? Или вывести прадедушек текущих пользователей?
Правило железобетонное одно - у отца всегда один сын.
Эээ... нипонял. Сын может быть только один? Или имеется в виду, что сущность "отец" подразумевает существование сущности "сын", относящейся к этому "отцу"? Но как насчет "дочерей", ведь по Вашему определению "отец" не будет "отцом", если у него только "дочь/дочери" и нет "сыновей". Ну и само собой, по Вашему же определению, если у "отца" больше одного сына, он уже не является "отцом".
CREATE TABLE `persons` (
`id` bigint not null auto_increment,
`name` varchar(100) not null,
`parent_id` bigint,
primary key(`id`),
unique(`name`), // ну наверное
unique(`parent_id`), // у одного отца не может быть больше одного сына,
constraint `fk_persons_2_persons` foreign key (`parent_id`)
references `persons` (`id`)
on delete cascade
on update cascade,
);