wyciąganie danych z relacyjnej bazy danych

Odpowiedz Nowy wątek
2011-07-08 15:51
0

Witam.
Używam PostgreSQL (od razu mówię, że zmiana bazy nie wchodzi w grę).
Mam 2 tabele:

Tabela OPISY
kolumna 1: o_id - typu integer
kolumna 2: tresc - typu text

Przykładowe dane wyglądają tak:
1, miły
2, bogaty
3, wysoki
4, mądry
5, szybki
6, wysportowany

Tabela OSOBY
kolumna 1: id - typu integer
kolumna 2: imie - typu varchar
kolumna 3: o_id - tyou integer[] (tabela elementów integer)

Dlatego trzecia kolumna typu tabelarycznego, bo zależało mi, aby dane były wprowadzane następująco:
1, Adam, {1,2,3,4}
2, Marcin, {2,4}
3, Bolek, {4,5,6}

zamiast tak:
1, Adam, 1
2, Adam, 2
3, Adam, 3
4, Adam, 4
5, Marcin, 2
6, Marcin, 4
7, Bolek, 4
8, Bolek, 5
9, Bolek, 6

Teraz chcę zrobić zapytanie wyciągające te dane do postaci:
1, Adam, miły bogaty wysoki mądry

I tu jest problem bo zapytanie typu:

SELECT osoby.id, osoby.imie, osoby.o_id AS cechy
FROM osoby
JOIN  opisy USING (o_id);

Nie działa z racji różnicy typów (integer i integer[]).

Czy da się to wyciągnąć jednym poleceniem (może mieć podzapytania itd.)?
Czy muszę do tego już napisać funkcję albo procedurę w PostgreSQL?
A może to już da się zrobić tylko w aplikacji do której dostarczane będą dane?


Suchy the Master
edytowany 3x, ostatnio: SuchyTheMaster, 2011-07-08 15:53
Taki rodzaj danych był powszechnie używany w bazach danych ADABAS. Rocznik 1969. - Marcin.Miga 2011-07-10 00:21

Pozostało 580 znaków

2011-07-09 02:11
0

Tak kończy się projektowanie bazy danych wg własnego widzimisię. Zrobiłeś sobie problem to teraz z nim walcz tak samo jak go sobie stworzyłeś sam.

Nigdy ale to nigdy nie zapisuj w bazie danych danych w taki sposób jak to zrobiłeś... Struktura tabeli, której chciałeś uniknąć jest jak najbardziej poprawna i co najważniejsze nie przysporzyłaby takich problemów ze złączeniami.

Pozostało 580 znaków

2011-07-09 02:22
0

http://pl.wikipedia.org/wiki/Posta%C4%87normalna%28bazy_danych%29


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2011-07-09 14:40
0

AdamPL: nie wiem skąd u Ciebie tyle arogancji i zbędnego jadu. Ale takie masz widzimisię, to radź sobie z tym sam. taki pomysł na tabele, to nie było widzimisie, tylko kwestia nauki, szukania, odkrywania, prób innych metod niż standardowe itd. Wiem jakie są normalne postacie baz danych i jak standardowo się je tworzy, aczkolwiek byłem ciekaw innego rozwiązania. Tak czy siak, nie da się tego zrobić bez pętli itd., co jednak będzie później mniej wydajne. Zatem pozostaje wrócenie do postaci normalnej i dołożenie jeszcze jednej tabeli i tyle.

Somekind: znam linka, ale dzięki.


Suchy the Master

Pozostało 580 znaków

2011-07-09 18:42
0

zrobiłeś po swojemu, źle, nie działa a teraz masz pretensję do wszystkich, że jak to, przecież to nie było widzimisie, tylko kwestia nauki, szukania, odkrywania, prób innych metod niż standardowe i miało działać! A jak ktoś ci to wypomniał to od razu jest be.
Napiszę to co piszę każdemu takiemu mądremu krzykaczowi - to ty masz problem a nie my i to ty przyszedłeś tutaj z prośbą o pomoc więc trochę pokory. Chciałeś zrobić coś po swojemu, nie wyszło więc zamiast się stawiać posłuchaj rad bardziej doświadczonych


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-07-09 21:08
0
Misiekd napisał(a)

zrobiłeś po swojemu, źle, nie działa a teraz masz pretensję do wszystkich, że jak to, przecież to nie było widzimisie, tylko kwestia nauki, szukania, odkrywania, prób innych metod niż standardowe i miało działać! A jak ktoś ci to wypomniał to od razu jest be.
Napiszę to co piszę każdemu takiemu mądremu krzykaczowi - to ty masz problem a nie my i to ty przyszedłeś tutaj z prośbą o pomoc więc trochę pokory. Chciałeś zrobić coś po swojemu, nie wyszło więc zamiast się stawiać posłuchaj rad bardziej doświadczonych

Nie wciskaj mi słów których nie mówiłem - nigdzie nie wspominałem, że "miało działać" i do nikogo z was nie mam pretensji, że nie działa. Nigdzie też nie mam pretensji o to, że podano mi linka z info (tak - zrozumiałem aluzje), ani o to co w drugiej części napisał AdamPL, bo te informacje są przydatne. Pretensje mam o podejście "zrobiłeś, to radź se sam" i o ton wypowiedzi - jeśli tak to wygląda, to po cholerę jest to forum? Mam nadzieję, że nie dla towarzystwa wzajemnej adoracji. Rad posłuchałem, poczytałem i zrobię jednak rozwiązanie które będzie zgodne z normą. A stawiać będę się każdemu zapatrzonemu w siebie człowiekowi, z przerostem własnego ego, który próbuje leczyć swoje kompleksy wjeżdżając na innych.

Jeśli dostanę bana, to trudno. Szanuję 4programmers, bo kiedyś miało mniej aspołacznych użytkowników i pomoc była na prawdę dobra trafiona i miła.

Wystarczyłoby, że Adam PL napisałby tylko ten fragment:

AdamPL napisał(a)

Nigdy ale to nigdy nie zapisuj w bazie danych danych w taki sposób jak to zrobiłeś... Struktura tabeli, której chciałeś uniknąć jest jak najbardziej poprawna i co najważniejsze nie przysporzyłaby takich problemów ze złączeniami.

Poszuukałbym więcej na ten temat dlaczego tak nie, a tak tak i już. A jeśli bym nie potrafił znaleźć/zrozumieć to bym poprosił o rozwinięcie/uzasadnienie. Ale nie, lepiej było robić od razu diss na ludzi.


Suchy the Master

Pozostało 580 znaków

2011-07-09 21:34
0

Chyba to wszystko nadinterpretujesz.

AdamPL napisał(a)

Tak kończy się projektowanie bazy danych wg własnego widzimisię. Zrobiłeś sobie problem to teraz z nim walcz tak samo jak go sobie stworzyłeś sam.

Ta wypowiedź ma takie przesłanie: "Projektowanie niezgodnie z zasadami prowadzi do problemów, które w normalnej sytuacji nie następują, więc nie ma na nie sensownych rozwiązań. Wszelkie obejścia trzeba wykombinować we własnym zakresie."
Nie odbieraj tego jako atak na siebie, po co? :)


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2011-07-10 00:48
0

Hm... może masz rację. Choć podkreślone sam, dość dobitnie podkreślało to wszystko.
Poza tym, można to ubrać w mniej pejoratywny ton, ot chociażby tak jak Ty to przed chwilą zrobiłeś.

Natomiast post użytkownika Misiekd, nie wniósł nic merytorycznego do dyskusji, a był czysto konfliktowy.

Wracając do tematu. Ok. Normy są takie, a nie inne i zapewnie w znacznej większości będą wydajniejsze. Ciekaw jestem czy gdyby była taka możliwość by zrealizować to tak jak na początku założyłęm to wydajność nie byłaby większa? Wiem, że znaczenie mają też inne pola, ilość rekordów, oraz to co się wyciąga z bazy itd.

Ps.
Ktoś wcześniej napisał:
"Taki rodzaj danych był powszechnie używany w bazach danych ADABAS. Rocznik 1969."
Teraz tego posta nie widze, widocznie usunięty.
Nie bym na siłę chciał stosować, ale jestem po prostu ciekawy takich rozwiązań - jakie były różnice w wydajności, jaki był odzew, czy gdzieś w większych projektach coś takiego zastosowano.


Suchy the Master

Pozostało 580 znaków

2011-07-10 12:49
0

To ja napisałem. Ale nie jako post, tylko komentarz. Nadal widnieje przy pierwszym poście. ADABAS + NATURAL nadal jest stosowanych w MainFraim-ach. Wiem, bo w tym pisałem :). A czy się przyjęło? Cóż - ewolucja zadecydowała...

Pozostało 580 znaków

2011-07-11 13:22
0

Kolego mój miły, to nie był żaden atak i arogancja. Po prostu uważam, że Twój pomysł zapisania kluczy do słownika w tabeli int jest zły. Krytyczne ocenianie czyjegoś pomysłu to ocenianie pomysłu, a nie osoby. Chyba zgodzisz się ze mną, że można być inteligentną osobą ale czasem mieć złe pomysły?! Napisałem, że powinieneś rozwiązać ten problem sam, ponieważ nie widziałem powodu dla którego ktoś miałby rozwiązywać problem, który stworzyłeś sobie na własne życzenie.

Niestety nie widzę po Tobie żadnej chęci rozwiązania tego problemu, nie zajrzałeś nawet do dokumentacji, nie poszukałeś w Google, dlaczego? Widzę natomiast w Twoich postach nieuzasadnione przekonanie, że może jednak ten pomysł jest dobry. Zlituje się nad Tobą i pokażę jak zrobić takie złączenie oraz przytoczę cytat z dokumentacji PostgreSQL na temat tego typu złączeń, może na tej podstawie sam trafnie ocenisz czy Twój pomysł jest dobry czy nie i przestaniesz się do mnie sadzić.

SELECT os.id, os.imie, os.o_id AS cechy
FROM osoby os
JOIN  opisy o ON o.o_id = ANY(os.o_id);

Tip: Arrays are not sets; searching for specific array elements may be a sign of database misdesign. Consider using a separate table with a row for each item that would be an array element. This will be easier to search, and is likely to scale up better to large numbers of elements.

Pozostało 580 znaków

2011-07-11 18:17
0

Nie neguję tego, że Twoja sugestia by tak nie robić była słuszna. Nie podważam jej treści merytorycznej, a jedyne formę. Jak dla mnie ton był bardzo prejoratywny. Cała Twoja wypowiedź mogła być po prostu napisana innym tonem.

Skoro nie widzisz, to już nic nie poradzę. Mogę tylko zaproponować ponowne przeczytanie poprzednich postów, gdzie napisałem, że zastusuję jednak postać normalną. Nie wiem skąd wniosek, że nie czytałem nic w dokumentacji ani na google nie szukałem? Bo nie znalazłem od razu rozwiązania? Podpowiem jedną rzecz, której ludzie z jakąś wiedzą często nie dostrzegają - gdy coś już się wie, to znalezienie tego w google jest bardzo proste. Jeśli się nie wie, albo uczy, to bywa już trudniejsze i często się błądzi. Nie zakładaj więc, że wszyscy mają taką wiedzę jak Ty.

Nie wiem też skąd sobie dopowiedziałeś, że uparłem się, iż pomysł "jest jednak dobry". Ponownie odsyłam do poprzednich postów, gdzie pisałem o tym jaką metodę jednak wybiorę. Tym bardziej, że zauważyłem w nim jeszcze jeden plus, na którym będzie mi później zależało.

A fakt, że chcę poznać też metody mniej wydajne i niezgodne z normą nie świadczy o tym, że będę je stosował. Dziękuję za info odnośnie zapytania. Nie pomyślałem w ogóle o ANY. Tak czy siak zastosuję sugerowaną przez Was metodę, a z ANY zobacze sobie tylko z czystej ciekawości jaka jest różnica wydajności.


Suchy the Master
Nadal uważam, że sobie coś dopowiadasz, ponieważ ja nic takiego nie chciałem napisać. Kilku zdaniowy post na forum to akurat kiepski sposób i miejsce na oddanie oraz odczytanie tego co ma się na myśli. Co do dokumentacji, to nadal uważam, że tam nie zaglądałeś. Przykład wykorzystania tabeli int w zapytaniu, jak i tip, który przytoczyłem jest w rozdziale 8 dokumentacji "Data types" w podrozdziale 8.14 "Arrays" czyli pierwszym i jedynym miejscu w dokumentacji PostgreSQL 9, który traktuje o tabelach. - AdamPL 2011-07-11 21:29

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0