wyciąganie danych z relacyjnej bazy danych

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?

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.

0

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

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.

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

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.

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? :)

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.

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...

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.

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