konto usunięte

Temat: Tabela w relacji sama do siebie

Witam
Mam następujący problem: spotkałem sie ostatnio z koniecznością obsługi tabeli będącej w relacji zwrotnej. Wykonywanie bardziej skomplikowanych zapytań na takiej tabeli troszke jednak wygląda inaczej anizeli na tabelach osobnych i nie ukrywam, ze mialem maly problem mimo, ze moze sie to wydawac proste. W necie nie udało mi sie znaleźć zadnych konkretnych przykładów, wyjaśnień itp. Moze ma ktoś jakies ciekawe materialy na ten temat, moze jakiś przydatny link, na który nie udalo mi sie trafić?

Będę wdzięczny za pomoc :)
Grzegorz K.

Grzegorz K. Angular, JavaScript,
Frontend, UI

Temat: Tabela w relacji sama do siebie

Leszek K.:
Witam
Mam następujący problem: spotkałem sie ostatnio z koniecznością obsługi tabeli będącej w relacji zwrotnej. Wykonywanie bardziej skomplikowanych zapytań na takiej tabeli troszke jednak wygląda inaczej anizeli na tabelach osobnych i nie ukrywam, ze mialem maly problem mimo, ze moze sie to wydawac proste. W necie nie udało mi sie znaleźć zadnych konkretnych przykładów, wyjaśnień itp. Moze ma ktoś jakies ciekawe materialy na ten temat, moze jakiś przydatny link, na który nie udalo mi sie trafić?

Będę wdzięczny za pomoc :)

Ale co potrzebujesz zrobić ?
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Tabela w relacji sama do siebie

Jeżeli dobrze rozumiem - powinieneś zaprzyjaźnić się z poleceniami CONNECT BY, PRIOR, START WITH, żeby poruszać się po drzewie np.

SELECT LEVEL, DEPTNO, EMPNO, ENAME, JOB, SAL
FROM EMP
CONNECT BY PRIOR EMPNO=MGR
START WITH MGR IS NULL;

Mamy tabelę EMP, jeden z atrybutów to empNo (numer pracownika), drugi to mgr (numer szefa).

START WITH określa od jakiego warunku rozpoczynamy przechodzenie po drzewie (MGR IS NULL czyli pracownik, który nie ma szefa, czyli szef).

CONNECT BY - określa związek (czyli chcemy aby numer pracownika był równy numerowi szefa - czyli budujemy hierarchię szef-pracownik)

PRIOR - określenie kierunku "chodzenia po drzewie". Jeśli PRIOR występuje przed MGR, to po odwiedzeniu rekordu z pewną wartością MGR odnajdywane są rekordy z odpowiadającą jej wartością EMPNO (kierunek "od dołu po drzewie"), jeśli PRIOR występuje przed EMPNO, to odwrotnie („od góry do dołu”).

Level to kolumna, która określa głębokość, na której się znajdujemy

Mam nadzieję , że o to chodziło, i że to co powyżej naskrobałem jest w miarę ok ;)

Pozdrawiam
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: Tabela w relacji sama do siebie

Wykonywanie zapytań wygląda o tyle inaczej, że trzeba stosować aliasy. No i trzeba uważać, żeby przez przypadek nie zapętlić (np. jeśli mamy w tabeli kategorie, z których każda może mieć kat. nadrzędną, to żeby nie powstała relacja, w której kategoria A jest nadrzędną dla B a B z powrotem dla A :)).

Więc konkretnie, z czym miałeś problem?

konto usunięte

Temat: Tabela w relacji sama do siebie

jaka baza danych, bo każda ma inne mechanizmy. np mssql ma konstrukcję CTE do zapytań rekurencyjnych
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Tabela w relacji sama do siebie

Przemysław R.:
jaka baza danych, bo każda ma inne mechanizmy. np mssql ma konstrukcję CTE do zapytań rekurencyjnych

Właśnie :D ja z rozpędu podałem sposób oraclowy, bo myślałem ,że to na tamtej grupie zostało napisane :D

konto usunięte

Temat: Tabela w relacji sama do siebie

Grzegorz Drzymała:
Przemysław R.:
jaka baza danych, bo każda ma inne mechanizmy. np mssql ma konstrukcję CTE do zapytań rekurencyjnych

Właśnie :D ja z rozpędu podałem sposób oraclowy, bo myślałem ,że to na tamtej grupie zostało napisane :D
To prawda Grzegorz, ale i tak dzieki za chęci. Chodzi o SQL Server i przykladowe zapytania. Tak jak tutaj wspomniany przyklad pracownicy - kierownicy, ilosc pracownikow dla danego kierownika itp. W necie jakos kurde mało bardzo o tym jest. Rzeczywiscie malo konkretnie sformułowałem problem, ale chodzi mi wlasnie ogolnie o prace na tego typu tabelach. W ksiazkach mamy rozne przyklady tabel połączonych i przykladowe do nich zapytania, ale neistety rzadko ktore mowią własnie o relacjach zwrotnych. Stąd moj problem i po prostu chcialem sie dokształcic , przez to pytalem o jakies linki itd.
Dzieki, pozdrawiam.

konto usunięte

konto usunięte

Temat: Tabela w relacji sama do siebie

Dziękuje, zajrze na pewno.
Adam O.

Adam O. Bazy danych etc

Temat: Tabela w relacji sama do siebie

Jeżeli już męczysz CTE, to polecam się zapoznać też z funkcjami rankingowymi, bardzo ładnie ze sobą grają w wielu zastosowaniach, tutaj jest opis jak to łączyć:

http://weblogs.sqlteam.com/jeffs/archive/2007/03/30/Mo...

Pomaga np przy oznaczaniu poziomu w hierarchii.
Piotr K.

Piotr K. QA / Test Engineer
at Luxoft / UBS

Temat: Tabela w relacji sama do siebie

Maciej Niedźwiecki:
Wykonywanie zapytań wygląda o tyle inaczej, że trzeba stosować aliasy. No i trzeba uważać, żeby przez przypadek nie zapętlić (np. jeśli mamy w tabeli kategorie, z których każda może mieć kat. nadrzędną, to żeby nie powstała relacja, w której kategoria A jest nadrzędną dla B a B z powrotem dla A :)).

Więc konkretnie, z czym miałeś problem?

ja bym w przypadku MySQL'a zastosował własnie aliasy

przyklad:

SELECT c1.name, c1.job, c2.name AS "Boss' Name", c2.job AS "Boss' Job"
FROM crew c1
LEFT JOIN crew c2 ON c1.boss = c2.id

struktura tabeli:

ID int(11)
NAME char(10)
JOB char(10)
BOSS int(11)

rezultatem bedzie lista wszystkich pracownikow z informacja kto jest ich szefem, lacznie z tymi ktorzy nie maja nikogo nad soba (pojawi sie null).
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Tabela w relacji sama do siebie

Ja na przyklad mniej wiecej tak sobie sprawdzam ostatnie wersje projektow (MS SQL)

Projekt | wersja
----------------
ABC001 | 1
ABC001 | 2
etc..

SELECT a.projekt, a.wersja FROM projekty AS a
WHERE wersja = (SELECT max(wersja) FROM projekty AS b
WHERE a.projekt = b.projekt)Bartosz Ślepowroński edytował(a) ten post dnia 25.05.09 o godzinie 16:05
Przemysław Krygier

Przemysław Krygier Specjalista Systemów
Informatycznych

Temat: Tabela w relacji sama do siebie

Witam

Nic nie stoi na przeszkodzie aby złączyć tabelę z samą sobą np:



SELECT u1.name as boss, u2.name as employee
FROM users u1 LEFT JOIN users u2
ON u1.id_users = u2.id_users_boss



Spotkałem się z opinią, że używanie w tabelach relacji do siebie jest złą praktyką ... i chyba coś w tym jest.

Pozdrawiam

konto usunięte

Temat: Tabela w relacji sama do siebie

powiem tak
złą praktyką jest trzymanie dwu oddzielnych słowników zawierających identyfikatory pracowników :) (tudzież inne tożsame) bo i po co tak robić skoro można w jednej?
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Tabela w relacji sama do siebie

Przemysław Krygier:
Spotkałem się z opinią, że używanie w tabelach relacji do siebie jest złą praktyką ... i chyba coś w tym jest.

Chcialbym poznac uzasadnienie takiej teorii :)Bartosz Ślepowroński edytował(a) ten post dnia 26.05.09 o godzinie 10:52

konto usunięte

Temat: Tabela w relacji sama do siebie

Bartosz Ślepowroński:
Chcialbym poznac uzasadnienie takiej teorii :)Bartosz Ślepowroński edytował(a) ten post dnia 26.05.09 o godzinie 10:52

Ja mam przynajmniej dwa argumenty za tym, że tworzenie tzw. "świńskiego ucha" nie jest dobrą praktyką.
Po pierwsze - słownik to słownik i powinny się tam znajdować tylko dane słownikowe. Powiązania pomiędzy danymi powinny się znajdować oddzielnej tabeli. Takie rozwiązanie ułatwia czytanie schematów bazy danych ponieważ wiemy, że w tabeli USERS sa dane użytkowników a tabeli USER_HIERARCHIES powiązania pomiędzy użytkownikami.
Po drugie - jeśli dane są tylko w jednej hierarchii to nie ma problemu, można dołożyć dodatkowe pole do tabeli podstawowej. Gorzej jest jeśli chcemy zaimplementować jakieś hierarchie alternatywne. Wtedy za każdy razem trzeba dokładać nowe pole do tabeli. Przy rozwiązaniu z wyrzuceniem hierarchii poza tabele podstawową zyskujemy elastyczność i można tworzyć nieskończenie wiele hierarchii bez zmiany w strukturach tabel.

Oczywiście działanie z best practice jest o wiele bardziej pracochłonne przy implementacji, ale za to bladziej elastyczne.

Ja osobiście stosuje obydwa sposoby w zależności od potrzeb:)
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Tabela w relacji sama do siebie

Nawet w bazie znormalizowanej zgodnie ze wszystkimi regulami sztuki na pewne pytania nie da sie odpowiedziec inaczej, niz laczac tabele z nia sama, wiec nie rozumiem co normalizacja ma tu do rzeczy (juz nie wnikajac w temat na ile normalizacja jest "best practice", w sieci leza tony artykulow na temat "kiedy normalizowac i na ile")

Wszystko sprowadza sie do tego, ze na pytanie o laczenie tabeli z nia sama nie ma jednoznacznej odpowiedzi, bo zawsze jest jakies "chyba ze" ;)Bartosz Ślepowroński edytował(a) ten post dnia 26.05.09 o godzinie 13:13

konto usunięte

Temat: Tabela w relacji sama do siebie

Słowem nie wspomniałem o normalizacji - pokazałem dlaczego trzymanie w tabeli relacji do tej samej tabeli nie jest rozwiązaniem dobrym - ale jednak stosowanym.

Zapytanie każdy pisze jak chce i jak potrafi. Może łączyć sobie te same tabele tyle razy ile mu się podoba byłe by zapytanie zwracało poprawny wynik w dopuszczalnym czasie i inna osoba czytająca zapytanie nie potrzebowała na rozumienie zapytania więcej czasu niż trwało napisanie.
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: Tabela w relacji sama do siebie

Przemysław R.:
powiem tak
złą praktyką jest trzymanie dwu oddzielnych słowników zawierających identyfikatory pracowników :) (tudzież inne tożsame) bo i po co tak robić skoro można w jednej?

Kwestie wydajnościowe? Tak na szybko: http://www.baohx.com/extras/zendcon/joinfu_zendcon.pdf strony 8-10
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Tabela w relacji sama do siebie

Przemysław G.:
Słowem nie wspomniałem o normalizacji - pokazałem dlaczego trzymanie w tabeli relacji do tej samej tabeli nie jest rozwiązaniem dobrym - ale jednak stosowanym.

Sorry, nie wiem skad mi sie ta normalizacja wziela, chyba pomieszalem watki ;)

Co nie zmienia faktu, ze odpowiedziales na pytanie, jak nalezy projektowac bazy a nie czemu nie powinno sie laczyc tabeli z nia sama.Bartosz S edytował(a) ten post dnia 27.05.09 o godzinie 12:41

Następna dyskusja:

Dynamiczna tabela




Wyślij zaproszenie do