Witajcie, mam problem z utworzeniem sensownej bazy danych pod hierarchię, którą chcę zaimplementować.

Typy użytkowników:
Mamy typy użytkowników (od użytkownika o najniższej randze do najważniejszego):
szeregowy, starszy szeregowy, kapral, starszy kapral, plutonowy, sierżant, starszy sierżant

Założenia:
1. Każdy z danej rangi może mieć "pod sobą" kilu niższych rangą. Np. jeden kapral może mieć "pod sobą" kilku starszych szeregowych, a każdy z nich kolejnych kilku szeregowych
2. Każdy szeregowy może mieć kilku starszych szeregowych nad sobą, lecz starszy szeregowy (i każdy wyższy rangą) może mieć tylko jednego przełożonego (tylko "najniższa" ranga może mieć kilu przełożonych)

Oczekiwania:
1. chciałbym wyciągnąć dla szeregowego wszystkich "nad" nim
2. dla starszego sierżanta chciałbym wyciągnąć wszystkich podwładnych
3. dla plutonowego chciałbym wyciągnąć wszystkich "nad" i "pod"


Moje pomysły:
I.
Utworzyć tabelę:
uzytkownicy
uid | login | st_sier_id | sier_id | plutonowy_id | star_kapr_id | karpral_id | star_szer_id |

Zalety jakie tutaj widzę to łatwość wyszukiwania - wpisuję tylko jeden SQL i mam:
ad.1.
  1. SELECT * FROM uzytkownicy WHERE uid IN (username, st_sier_id, sier_id, plutonowy_id, star_kapr_id, karpral_id, star_szer_id) AND uid = moje_id;

ad.2.
  1. SELECT * FROM uzytkownicy WHERE st_sier_id = moje_id;

ad.3.
  1. SELECT * FROM uzytkownicy WHERE plutonowy_id = moje_id OR uid IN (username, st_sier_id, sier_id)


Wady widzę dwie:
1. Podwładny może mieć tylko jednego przełożonego (a przydałoby mi się, by szeregowy mógł mieć więcej niż jednego)
2. W przypadku wprowadzenia np. podporucznika trzeba dodawać kolumnę


II.
Utworzyć tabele:
uzytkownicy
uid | login |

relacje_uzytkownikow
id | podwladny_id | przelozony_id |

Tutaj zaletami jest:
1. Możliwość w obie strony podpięcia wielu użytkowników (przełożonych <potrzebne tylko przy szeregowym> i podwładnych)
2. Brak konieczności dodawania kolumn w tabeli przy dodaniu np. podporucznika

Wadami natomiast wyszukiwanie.
O ile nie wiedzę problemu w tworzeniu zapytania wyszukującego bezpośrednich podwładnych/przełożonych:
  1. SELECT * FROM relacje_uzytkownikow ru LEFT JOIN uzytkownicy u u.uid=ru.podwladny_id WHERE przelozony_id = moje_id;

  1. SELECT * FROM relacje_uzytkownikow ru LEFT JOIN uzytkownicy u u.uid=ru.przelozony_id WHERE podwladny_id = moje_id;


O tyle nie za bardzo wiem jak szukać głębiej? W PHP napisać pętlę, która będzie się kręciła do czasu dojścia na samo "dno" lub "wierzch"?
Czy jest jakiś magiczny SQL który pomoże mi w takim działaniu?

III.
Połączenie obu przypadków:
Utworzyć tabele:
uzytkownicy
uid | login | st_sier_id | sier_id | plutonowy_id | star_kapr_id | karpral_id |

relacje_uzytkownikow
id | starszy_szer_id | szeregowy_id |

W przypadku rang, które nie muszą mieć kilu przełożonych - dopisywać do tabeli użytkowników
Szeregowych również dopisywać do tabeli użytkowników z NULL'ami (sic!) w rangach, a w poprzez tabelę łącznikową (relacje_uzytkownikow) dopisywać ich do starszych szeregowych.

Pozdrawiam i liczę gorąco na Waszą pomoc, którą opcję wybrać, a może jest jakiś lepszy pomysł? smile.gif

EDIT:
Po namyśle mogłoby działać jak sklepy z kategoriami, podkategoriami i produktami.
Jednakże każda "kategoria" też byłaby użytkownikiem.
Problem w tym, że w sklepach kategorie i użytkownicy są w różnych tabelach, a potrzebuję, by były w jednej.