|
Вопрос # 2 549/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Мне нужна идея создания алгоритма программы. Я пишу программу по составлению древа семьи. Возник вопрос: как связать между собой родственников? Может, уже существуют какие-то формы, виды связей? Мне не нужен код программы, мне нужен алгоритм или идея! Может, кто-то уже писал подобную программу?
 |
Вопрос задала: Тамара (статус: Посетитель)
Вопрос отправлен: 20 марта 2009, 15:37
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Dron
Здравствуйте, Тамара!
Я бы сделал запись, которая хранит информацию об одном человеке. Среди основных полей (имя, фамилия и т.п.) - уникальный номер человека (1, 2, ...). Кроме этого, часть полей - связи. Например, поля "мать" и "отец" - в них будут записаны номера соответствующих людей. Или, например, где-то отдельно хранится информация о всех людях, а отдельно - связи между ними в формате человек_1 - человек_2 - тип_родственной связи. Тип связи - родитель/ребёнок/брат-сестра и т.д. В случае, если данные предполагается хранить в БД, второй вариант предпочтительнее - 2 таблицы полностью содержат все данные. Если же информация в файлах, с записями проще - их можно просто и удобно записывать в файл и считывать оттуда. Хотя никто не запрещает сделать наоборот. По сути дела, для всех "соседей" нужно указать тип связи. Если указывать связи вообще между всеми людьми - это будут избыточные данные. Связи типа "дедушка", "бабушка", "двоюродный брат" и пр. (коих на самом деле очень много) можно определять динамически путём прохода по дереву. Проход вверх - узнаём номер родителя, затем номер родителя этого человека и т.д. Способов действительно много. Свои мысли я изложил.
 |
Ответ отправил: Dron (статус: Студент)
Время отправки: 20 марта 2009, 15:51
Оценка за ответ: 5
Комментарий к оценке: Спасибо! У меня были такие-же идеи!!! Но вот с базами я работать не умею.. Так что поле с информацией о каждом человеке, где и будут указаны связи - я представляю, как сделать, но ведь это очень кропотливая работа!!
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 20 марта 2009, 19:05; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 20 марта 2009, 15:53 [#1]:
Есть одно, чего пока точно не отменяли - "родитель-отпрыск". Этого уже предостаточно. понятное дело, что любой отпрыск должен иметь как минимум одну пару биологических родителей и неограниченное кол-во гражданских (биологические родители обычно и есть гражданскими). при этом неплохо указывать и даты когда они стали таковыми и когда перестали.
А на основании этого можно искать всё. например, если два человека есть гражданскими родителями одного человека в заданный момент времени - значит они женаты (ну где то так).
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Тамара (статус: Посетитель), 20 марта 2009, 16:21 [#2]:
Вадим К, я перебрала множество вариантов и остановилась на том, что оптимально отображать родство -от "дедушки-бабушки" до "внуки-внучки". Это наиболее информативно и наглядно. Мне кажется, мало будет связей " родитель-отпрыск", но я подумаю над этим вариантом... А "гражданских родителей" я ограничела пятью видами - "мать", "отец", "отчим", "мачеха" и "другой" ( на всякий случай - типа двоюродной тётки, которая растила,- и всё.
|
|
Вадим К (статус: Академик), 20 марта 2009, 16:25 [#3]:
А что такое дедушка? это отец отца или отец матери. Не более. Зачем плодить лишние связи. Потом прийдётся что то поправить и это будет ЧП.
Родитель-отпрыск будет как раз, если указывать всех "родителей". а является ли отец дядей... это отдельная история. Жизнь такая штука, что иногда человек может являться сам себе дедушкой. Да, и так бывает.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Тамара (статус: Посетитель), 20 марта 2009, 17:51 [#4]:
Вадим К, ты, конечно, прав, но каким образом отображать "дедушек-бабушек" на одной странице с "внуками"? Всё-равно придётся резервировать ячейку для "деда" с сылкой на "папу папы". Так ведь? Или я не права?
|
|
Вадим К (статус: Академик), 20 марта 2009, 18:13 [#5]:
не надо ничего резервировать. Просто прийдётся находить дедушку в два приема. то есть, с начала отца/мать, а потом их отца. Это сразу решает проблему с тем, что у человека может оказаться не 2, а больше дедушек. А если в базе заводить поле дедушка, то нарушается один с принципов баз данных - появляется избыточность и лишняя связаность.
я бы таблички такие делал.
таблица человек
id
имя/фамилия/отчество (в некоторый случаях родитель не хочет давать свое отчество или отец неизвестен)
id_отца
id_матери
датарождения, пол и прочьи радости.
вторая таблица. "связи"
id,
id_отпрыска
id_родителя
дата_начала_прав
дата_конца_прав
третья таблица "семья-брак"
id
создание
разрушение
--- не знаю, нужно ли это и другое поле, так как они выводяться
четвертая таблица "члены семьи"
id
id_семьи
id_человека
дата_вхождения
дата_выхода.
вторая и четвертая таблица - это таблицы "много-много". то есть, на каждого члена семьи мы заводим отдельную строку.
Такая структура позволит удерживать даже хитрые комбинации, например "шведские семьи".
Но это набросок. надо думать.
З.Ы. тут принято на Вы вообще то.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Тамара (статус: Посетитель), 20 марта 2009, 18:54 [#6]:
ЗЫЗЫ: Вадим К: я извиняюсь за фамильярность.
Идея интересная, надо обдумать, но сразу возникает вопрос: каким образом сохранять данные? Каждая таблица должна сохраняться отельным модулем( например, строчкой в тхт файле) или необходимо использовать "базы"? Я обдумаю этот вариант. Спасибо!
|
|
Вадим К (статус: Академик), 20 марта 2009, 19:05 [#7]:
обычная база данных. А вот какая - это Ваше личное дело. Хоть в текстовом файле.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|