проблема родственных связей

~Bazul~
Дата: 18.12.2002 21:07:35
Ситуация : есть люди, люди группируются в семьи.
В переложении на реляционную модель:
таблица про людей: People(Key,Name,Age,Sex,...) - всё просто.
А вот как организовать таблицу родственных связей?
Если не нужно указывать степень родства, то так:
Family(KeyPeople1,KeyPeople2)
Но когда нужно указывать, кто кому брат, а кто кому сват?
Завести справочник родственных уз. Ok. Завели.
Добавили колонку в Family, к примеру Link .

Задача : отметив, что Петров Иванову - отец, хочется сразу получить и обратную связь: Иванов то Петрову - сын.
Задача усложненная: Если у Петров связан родственными узами с Ивановым, Сидоровым и Барановым, то отметив эти связи один раз со стороны Петрова мечтается увидеть, что у Баранова заполнена семья (Петров, Сидоров) и у Сидорова (Иванов, Петров) с указанием соответствующих уз.

Вот. Неделю голову ломаю. Может кто уже?
Поделитесь!!!
Shark
Дата: 18.12.2002 21:23:06
Надо во избежание дублирования записей в первую колонку всегда писать того, кто первее в списке. Потом сделать Union по первой и второй колонке нашего Чела, причем связь для второй колонки перекодировать.
Вот.
~Bazul~
Дата: 18.12.2002 21:32:28
UNION годится при связи 1 -> 1.
Пример: Петров -> Сидорову : отец
отсюда получаем : Сидоров -> Петрову : сын.

А вот в таком случае ?
Петров -> Сидоровой : отец
Петров -> Овечкиной : сын

получаем:

Сидорова -> Петрову : дочь
Овечкина -> Петрову : мать

а хотелось еще получить, что Сидорова -> Овечкиной : внучка
и следовательно Овечкина -> Сидоровой : бабушка.

Се ля ви , вообщем.
Shark
Дата: 18.12.2002 21:50:46
А сколько уровней тебя интересуют? И как ты предполагаешь оргнизовать справочник родств?
Shark
Дата: 18.12.2002 22:02:35
В порядке бреда.
Где у нас бабушки - вот они.
Где у нас правнуки- вот они. Для каждого варианта пишем код.
Потом анализируем.
~Bazul~
Дата: 18.12.2002 23:19:33
Глубина учета связей - только близкие родственники (родители, прародители (бабушки, дедушки), дети -> мужья-жены, тещи-зятья, братья-сестры).

Но даже с этой оговоркой как-то все нетривиально.
LexusR
Дата: 19.12.2002 07:25:29
Предлагаю Вариант
CREATE TABLE [dbo].[People] (
[PeopleID] [int] NOT NULL ,
[Surname] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
[Name] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
[Patronymic] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL )
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(1,'Иванов','Иван','Петрович')
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(2, 'Иванов','Сергей','Иванович')
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(3, 'Иванова','Мария','Александровна')
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(4, 'Иванова','Ольга','Ивановна')
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(5, 'Иванов','Петр','Петрович')
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(6, 'Иванов','Анна','Николаевна')
CREATE TABLE [dbo].[FamilyType] (
[FamilyType] [int] NOT NULL ,
[TypeName] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL)
INSERT INTO FamilyType (FamilyType,TypeName) Values(1,'отец')
INSERT INTO FamilyType (FamilyType,TypeName) Values(2,'мать')
INSERT INTO FamilyType (FamilyType,TypeName) Values(3,'муж')
INSERT INTO FamilyType (FamilyType,TypeName) Values(4,'жена')
INSERT INTO FamilyType (FamilyType,TypeName) Values(5,'сын')
INSERT INTO FamilyType (FamilyType,TypeName) Values(6,'дочь')
INSERT INTO FamilyType (FamilyType,TypeName) Values(7,'брат')
INSERT INTO FamilyType (FamilyType,TypeName) Values(8,'сестра')
INSERT INTO FamilyType (FamilyType,TypeName) Values(9,'дед')
INSERT INTO FamilyType (FamilyType,TypeName) Values(10,'бабка')
INSERT INTO FamilyType (FamilyType,TypeName) Values(11,'внук')
INSERT INTO FamilyType (FamilyType,TypeName) Values(12,'внучка')
INSERT INTO FamilyType (FamilyType,TypeName) Values(13,'сноха')
INSERT INTO FamilyType (FamilyType,TypeName) Values(14,'свекровь')
INSERT INTO FamilyType (FamilyType,TypeName) Values(15,'свекор')
CREATE TABLE [dbo].[FamilyLink] (
[PeopleID] [int] NOT NULL ,
[LinkPeopleID] [int] NOT NULL ,
[TypeID] [int] NOT NULL
)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(1,2,1)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(1,3,3)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(1,4,1)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(1,5,5)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(1,6,5)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(2,1,5)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(2,3,5)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(2,4,7)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(2,5,11)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(2,6,11)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(3,1,4)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(3,2,2)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(3,4,2)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(3,5,13)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(3,6,13)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(4,1,6)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(4,2,8)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(4,3,6)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(4,5,12)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(4,6,12)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(5,1,1)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(5,2,9)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(5,3,15)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(5,4,9)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(5,6,3)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(6,1,2)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(6,2,10)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(6,3,14)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(6,4,10)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(6,5,4)

select P1.Surname, P1.Name, P1.Patronymic,FT.TypeName,
P2.Surname,P2.Name,P2.Patronymic
from People P1, People P2, FamilyType FT, FamilyLink FL
where P1.PeopleID = FL.PeopleID
and P2.PeopleID = FL.LinkPeopleID
and FT.FamilyType = FL.TypeID
order by P1.Surname
LexusR
Дата: 19.12.2002 07:25:29
Предлагаю Вариант
CREATE TABLE [dbo].[People] (
[PeopleID] [int] NOT NULL ,
[Surname] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
[Name] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
[Patronymic] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL )
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(1,'Иванов','Иван','Петрович')
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(2, 'Иванов','Сергей','Иванович')
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(3, 'Иванова','Мария','Александровна')
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(4, 'Иванова','Ольга','Ивановна')
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(5, 'Иванов','Петр','Петрович')
INSERT INTO People(PeopleID,Surname,Name,Patronymic) Values(6, 'Иванов','Анна','Николаевна')
CREATE TABLE [dbo].[FamilyType] (
[FamilyType] [int] NOT NULL ,
[TypeName] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL)
INSERT INTO FamilyType (FamilyType,TypeName) Values(1,'отец')
INSERT INTO FamilyType (FamilyType,TypeName) Values(2,'мать')
INSERT INTO FamilyType (FamilyType,TypeName) Values(3,'муж')
INSERT INTO FamilyType (FamilyType,TypeName) Values(4,'жена')
INSERT INTO FamilyType (FamilyType,TypeName) Values(5,'сын')
INSERT INTO FamilyType (FamilyType,TypeName) Values(6,'дочь')
INSERT INTO FamilyType (FamilyType,TypeName) Values(7,'брат')
INSERT INTO FamilyType (FamilyType,TypeName) Values(8,'сестра')
INSERT INTO FamilyType (FamilyType,TypeName) Values(9,'дед')
INSERT INTO FamilyType (FamilyType,TypeName) Values(10,'бабка')
INSERT INTO FamilyType (FamilyType,TypeName) Values(11,'внук')
INSERT INTO FamilyType (FamilyType,TypeName) Values(12,'внучка')
INSERT INTO FamilyType (FamilyType,TypeName) Values(13,'сноха')
INSERT INTO FamilyType (FamilyType,TypeName) Values(14,'свекровь')
INSERT INTO FamilyType (FamilyType,TypeName) Values(15,'свекор')
CREATE TABLE [dbo].[FamilyLink] (
[PeopleID] [int] NOT NULL ,
[LinkPeopleID] [int] NOT NULL ,
[TypeID] [int] NOT NULL
)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(1,2,1)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(1,3,3)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(1,4,1)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(1,5,5)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(1,6,5)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(2,1,5)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(2,3,5)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(2,4,7)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(2,5,11)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(2,6,11)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(3,1,4)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(3,2,2)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(3,4,2)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(3,5,13)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(3,6,13)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(4,1,6)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(4,2,8)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(4,3,6)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(4,5,12)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(4,6,12)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(5,1,1)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(5,2,9)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(5,3,15)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(5,4,9)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(5,6,3)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(6,1,2)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(6,2,10)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(6,3,14)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(6,4,10)
INSERT INTO FamilyLink(PeopleID,LinkPeopleID,TypeID)values(6,5,4)

select P1.Surname, P1.Name, P1.Patronymic,FT.TypeName,
P2.Surname,P2.Name,P2.Patronymic
from People P1, People P2, FamilyType FT, FamilyLink FL
where P1.PeopleID = FL.PeopleID
and P2.PeopleID = FL.LinkPeopleID
and FT.FamilyType = FL.TypeID
order by P1.Surname
~Bazul~
Дата: 19.12.2002 07:48:14
Проблема в том, что нужно автоматически обрабатывать введенные пользовтелем данные: введена некоторая связь - должны появиться/отобразиться узы у связанных людей.
Shark
Дата: 19.12.2002 08:01:42
Так чем плохо написать процедуру(функцию) для каждого вида родства, потом сложить их вместе и отфильтровать? Я понимаю, что долго, но , тк надо учитывать пол промежуточного родственника, свой пол, чужой, по моему проще не получается.