Witam, od kilku dni tworzę stronę drzewa genealogicznego, próbuję stworzyć funkcję do znalezienia połączenia między osobami, niestety chociaż funkcja działa, to wyszukuje osoby tylko do ok. 10 etapów, ponieważ dla dalszych odległości funkcja ładuje się za długo. Oto sposób zapisu danych osobowych w bazie danych SQL: są 3 tabele:
pierwsza "osoby" - zawiera ID osoby, imię, nazwisko, płeć, datę i miejsce narodzin i śmierci itd.
druga "rodziny" - zawiera ID rodziny, ID matki i ID ojca
trzecia "dzieci" - zawiera ID dziecka i ID rodziny
stworzyłem dwie tabele "rodziny" i "dzieci" ponieważ w jednej rodzinie dzieci może być więcej, po prostu z danej rodziny łatwiej jest wyjąć dzieci, które są w osobnej tabeli. Wyszukiwarka i drzewo działają bardzo dobrze, ale plik php który ma znaleść połączenie nie daje rady. Ponieważ ten kod ma ponad 200 linii napiszę co prostu jak działa:
Do funkcji szukaj_połączenia() przekazuję Id osoby początkowej i Id osoby końcowej i ograniczenie wyszukania do 5
Wyszukuję i zapisuję wszystkie osoby w odległości 5 kroków od osoby początkowej (razem z połączeniem) np.
[0] -> Jan Kowalski (Id: 123), [1] -> jego mama (Id: 234), [2] -> jego babcia (Id: 1321), [3] -> jego prababcia (Id: 12), [4] -> jego praprababcia (Id: 666)
Takich połączeń w odległości 5 kroków jest (w zależności od osoby) ok. 30 - 50. Te wszystkie połączenia znowu daję do funkcji, tym razem daję ograniczenie wyszukiwania do 10 (w tablicach jest już 5 osób, więc chodzi o kolejne 5), w założeniu miałem poszerzać zakres wyszukiwania o 5, za każdym razem gdy funkcja zwróci wszystkie połączenia a osoba docelowa nie została znaleziona (szukaj osoby docelowej w promieniu 5.. 10.. 15.. 20.. kroków itd.) Niestety ponieważ z każdym krokiem liczba osób drastycznie rośnie, wyszukiwarka znajduje osoby do ok. 10 kroków (to jest ok. 700 osób), dla dalszych połączeń strona kręci się bez końca.
I tutaj moje pytanie, czy jest jakiś sposób lepszego zapisu danych i/lub lepszego sposobu wyszukującego to połączenie? Mogę jeszcze tylko powiedzieć, że na stronie Myheritage, która wyświetla drzewa genealogiczne, wyszukiwanie połączenia trwa pół sekundy, nawet gdy dwie osoby są od siebie bardzo daleko.
Zdaję sobie sprawę że moje pytanie skomplikowane i zagmatwane, ale w razie jakichkolwiek wątpliwości proszę o zadanie pytania w komentarzach.