Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Drzewo genealogiczne
Forum PHP.pl > Forum > Przedszkole
busyboy
Witam

Zamierzam zrobić drzewo genealogiczne. I w przypadku jakby to były zwykłe dane typ data urodzenia, miejsce, imię, nazwisko itp. Nie było by problemu. Problem pojawia się w momencie dodatkowych informacji typu matka, ojciec, współmałżonek oraz dzieci.

W takim przypadku każde wpisane dziecko może być rodzicem oraz posiadać współmałżonka, jak również każde wpisany współmałżonek może posiadać dzieci.
Nie mam pojęcia w jaki sposób to rozwiązać sad.gif czy da się zrobić na jednej tabeli ? czy użyć jednej tabeli głównej a dodatkowych tabel dla współmałżonka oraz dodatkowej tabeli dla dzieci. Tylko jak bym zastosował takie rozwiązanie jak powyżej to w przypadku np. dodania dziecka do tabeli dodatkowej to powinien również dodać wpis do tabeli głównej bo przecież dziecko może być również ojcem czy matką.

Przykład poniżej

Tabela główna
Id_główne – imię – nazwisko – data urodzenia – miejsce – współmałżonek itp.

Tabela dodatkowa (współmałżonek)
Id_współ – id_główne – imię – nazwisko - data urodzenia – miejsce itp.

Tabela dodatkowa (dziecko)
Id_dziecko – id_główne - imię – nazwisko - data urodzenia – miejsce itp.

Proszę o pomoc...


viking
Poczytaj na stronie depesz.com o drzewach. Tu się prosi o zwykłe drzewko id, parentid.
busyboy
Dziękuje za przykład, a jaka metoda drzewa w moim przypadku byłaby najlepsza ? bo na stronie jest kilka.
viking
A która ma id, parentid?
busyboy
Generalnie 3 metody mają parametr id i parent_id w przykładzie

metoda wielu tabel
metoda “śledzenie rodzica”
metoda pełnych ścieżek



Witam ponownie

Przeanalizowałem sugerowane rozwiązanie – id, parentid
I generalnie w drzewie genealogicznym nie można tego zastosować – już tłumacze dlaczego – proszę o sprostowanie jeżeli podszedłem do zagadnienia.

Jest Ojciec Marek

[id] [parenid] [nazwa]
1 0 Marek

I ma Córkę Zosię i syna Olka

[id] [parenid] [nazwa]
2 1 Zosia
3 1 Olek

A syn Olek na Córkę Marysie

[id] [parenid] [nazwa]
4 3 Marysia

I tak dalej – to oczywiście jest jasne i przejrzyste.

A co w przypadku gdy Ojciec Marek ma żonę Annę ? Przecież nie mogę nie mogę dodać wpisu w takiej formie

[id] [parenid] [nazwa]
5 0 Anna

Ponieważ Dziecko nie będzie powiązane z dwoma rodzicami a tylko z jednym.

Z powyższego przykładu wynika że drzewo należy wprowadzać od korzenia. A co w przypadku gdy okaże się że będę chciał wprowadzić Ojca i Matkę Marka, w powyższym przykładzie nie ma takiej możliwość.

viking
Jakoś tak, nie chce mi się już myśleć o tej porze http://sqlfiddle.com/#!17/f6c3e/1
busyboy
Ok to jest dla mnie jasne, ale jak dodać wpis do bazy. Bo przecież np. Ojciec jest dodany, następnie dodajemy Dziecko do Ojca a co z Matką ? Soko już Dziecko jest dodane ? do Ojca ?

A co z wprowadzaniem danych ? w tym przypadku można tylko i wyłącznie wprowadzać dane od korzenia.
Pyton_000
Ja bym się chyba pokusił o Nested Set ale z założeniem że małżonek jest przyklejony przez np. partner_id. Cała reszta by była spoko. Zaczynasz od zerowego korzenia a potem dodajesz pierwszy wpis
busyboy
Pyton_000 ja rozumie jedną i drugą metodę (Nested Set z tego co doczytałem jest to metoda left - right) strukturę w bazię itp. A jak dodawać w tym przypadku rekordy. Skoro jak dodam Ojca a następnie jego dziecko to w jaki sposób mam dodać Matkę do dziecka skoro już zostało dodane do Ojca ?
Pyton_000
Nie dodajesz.

Jeśli dzieckiem rodzica jest Mężczyzna to żona jest przyklejona jako partner_id

Potem dziecko przyklejasz do ojca. Ojciec ma "w sobie" informację o matce.
busyboy
Nie rozumiem sad.gif

Dodaje pierwszy wpis

[id] [parenid] [Nazwa]
1 0 Marek (Ojciec)

Dodaje drugi wpis

[id] [parenid] [Nazwa]
2 1 Kasia (Córka)

A Matka gdzie ? jak ją dodam skoro już jest jeden wpis z dzieckiem i nie może być dwóch ?

Pyton_000
ja mówię o nested set z partner_id

Coś takiego:
Kod
                                                    root (1,8)
                                                        |
                                                       /
                                            Marek (ojciec) (2,7) partner_id = 1(Ola)
                                                    |
                                               /         \
                                            Ala(3,4)     Tomek(5,6)


tabela partners
id, name
---------------
1, Ola


Czyli Ola (matka) jest przyklejona do Marka przez kolumnę partner_id (obok parametrów left i right)
busyboy
Czyli można również to zrobić w taki sposób (dodać)

[id_rodzic] [id_dziecko] [nazwa]

1 0 Marek (Ojciec)
2 1 Kasia (Córka)
3 1 Monika (Córka)

A następnie dodać e oddzielnej tabeli (partner)

[id] [id_partner][nazwa]
1 1 Marta (Żona Martka)
2 3 Tomek (Mąż Moniki)

Dobrze rozumiem ?

viking
Dałem ci pełen przykład z twoimi danymi a ty się upierasz na wciskanie imienia do drzewa. A jak będziesz chciał date urodzenia np dodać? Oczywiste że musisz zacząć od góry choćby ze względu na klucze obce których mi się nie chciało zakładać. Metoda z przypieciem matki też może być.
Tomplus
Rozdziel sobie tabele na 2 lub więcej
W jednej są tabele identyfikacyjne ludzi, imiona, nazwiska, daty
W drugiej powiązania.

W ogóle co z dziećmi, skąd wiadomo które jest czyje. Przecież są różne przypadki rodzicielstwa.


Więc powinna być kolejna tabela z gdzie:

id_child | id_men_parnter | id_women_partner | id_relationship

id_relationship - to typ relacji
np. 1 - dziecko rodzone
2 - adopcja
3 - etc.
busyboy
Czy tak może wyglądać tabela ? przykład poniżej

[id] [id_partner] [id_dziecko] [imie] [płec] [naziwsko] [data_urodzenia] [miejsce]
1 0 0 Marek M Nowak 10.08.1965 Warszawa Tata
2 1 0 Anna K Nowak 15.05.1969 Warszawa Mama
3 0 1 Zosia K Kowalska 20.03.1989 Toruń Córka (Taty i Mamy)
4 0 1 Tomek M Nowak 15.04.1990 Wrocław Syn (Taty i Mamy)
5 3 0 Wojtek M Kowlaski 13.02.2987 Toruń Mąż Zosi
6 3 0 Marek M Lisiecki 15.06.1985 Poznań 2 Mąż Zosi
7 0 6 Bosia K Lisiecka 10.02.2017 Poznań Córka (Zosi i 2 męża Marka)
Tomplus
Tak jak powiedział Viking, nie wrzucaj do drzewa danych osobowych. W drzewie zostaw podstawowe powiązania czyli same ID.

Dwa... [id_partner] [id_dziecko]
Po co to tutaj?

Co z przypadkami wielożeństwa, wielodzietnością? Z dziećmi z małżeństw mieszanych?

Nazewnictwo:
Tata, mama to tak się mówi w domu, powinieneś używać oficjalnego nazewnictwa powiązań:
Ojciec, matka, stryj, pasierb, wuj, ciotka, swat, teść, teściowa, świekr, świekra, szwagier, zięć, synowa, probant, kuzyn, brat/siostra cioteczny/wujeczny etc.
busyboy
Witam,

Nazewnictwo typu Mat,Tata podał tylko i wyłącznie do przykładu (oczywiście że te dane nie zostaną napisane)

Jeżeli chodzi o nazewnictwo (w tym przypadku nie jest mi coś takiego potrzebne - stryj,treść,wuj etc.) Chodzi mi tylko o podstawowe informacje imię,nazwisko,data urodzenia,miejsce plus ewentualnie inne dane które można dodać (podstawowe)

Wielożeństwo jest brane pod uwagę, wielodzietność też a jeżeli chodzi o małżeństwa mieszane hmm nie idźmy aż w takie strajności to ma być proste drzewo genealogiczne przedstawiające rodziców oraz ich dzieci nic więcej.

Dlaczego nie mogę do tabeli wrzucać dodatkowych danych tylko powiązania ? W takim przypadku (tak mi się wydaje) jestem w stanie zrobić to w jednej tabeli...

W przykładzie powyżej (tabeli) pokazałem moje rozwiązanie (mam dzieje poprawne) i prosiłem Was o weryfikację. Jest tam uwzględniona wielodzietność oraz przypadek wielożeństwa

[id] [id_partner] [id_dziecko] [imie] [płec] [naziwsko] [data_urodzenia] [miejsce]
3 0 1 Zosia K Kowalska 20.03.1989 Toruń Córka (Taty i Mamy)
4 0 1 Tomek M Nowak 15.04.1990 Wrocław Syn (Taty i Mamy)

[id] [id_partner] [id_dziecko] [imie] [płec] [naziwsko] [data_urodzenia] [miejsce]
3 0 1 Zosia K Kowalska 20.03.1989 Toruń Córka (Taty i Mamy)
5 3 0 Wojtek M Kowlaski 13.02.2987 Toruń Mąż Zosi
6 3 0 Marek M Lisiecki 15.06.1985 Poznań 2 Mąż Zosi
viking
Zrób jak uważasz. Najwyżej przepiszesz.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.