🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych
Article #194106

Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?

#194106
From: wloochacz
Date: Mon, 09 Feb 2015 17:54
98 lines
6380 bytes
W dniu 2015-02-09 o 15:49, Marek pisze:
> W dniu 2015-02-09 o 09:40, nkab@toya.net.pl pisze:
>
>> Przy księgowości bez indeksów ciężko byłoby zliczać dane powiązane
>> z innymi tabelami, no ale to są sztywne rozwiązania, a kolega Marek
>> chce dowolności w wyborze pól.
>
> Czytam, czytam Waszą rozmowę :-)
Mam nadzieję, że nie wszystko - bo czasem ktoś palnie jakąś głupotę. jak 
np. z dodawanie indeksów, które tworzą pliki...
WTF - jakie kurna pliki?
W DBF to faktycznie tak było... I pewnie w MyISAM - bo to jak sama nazwa 
wskazuje, takie DBFy (czyli ISAM) są z nakładka SQLa i razem to się zwie 
- MySQL.

> Wyjaśnię: tak, chcę dowolności choć zależnie od przyjętego rozwiązania
> nie musi być to "frywolne powiązanie" bez indeksów. Jeśli przyjęlibyśmy
> koncepcję dublowania wartości pól:
> a) W tabeli wartości pól
Trzymaj się tego, bo innego raczej nie ogarniesz w tej chwili...

> b) W dynamicznie dostawianych polach w tabeli właściwej (tzn.
> zawierającej dane, które rozszerzamy o dodatkowe pola) z narzuceniem
> typu pól i budowaniem na nich indeksów gdzie trzeba.
>
> To wtedy nie ma problemu w tworzeniu relacji. Aczkolwiek dynamiczne
> dostawianie pól to nie jest profesjonalne podejście...
Uzasadnij, bo mam dokładnie odwrotne wyobrażenie.
Tylko jest kilka ALE - nie wyobrażam sobie ręcznego zarządzania tym 
bajzlem. to musi być rozwiązane systemowo i automatycznie w taki sposób, 
aby raz dodane pole było widoczne dla całego systemu.
Bez rekompilacji systemu (albo zmiany kodów źródłowych w językach 
skryptowych - jeżeli ktoś się ma ochotę czepić...).
Ale takie podejście przerasta większość "programistów".
Sorry - taka prawda.

Po drugie, nie każdemu takie podejście potrzebne. W realnym zastosowaniu 
okazuje się, że wykorzystanie paradygmatu EAV (doczytaj se w wikipedii 
czy gdzie tam chcesz co to, po co i na co) ze wszystkimi jego wadami 
daje po prostu radę.
I od tego bym na Twoim miejscu zaczął, skoro dla Ciebie "ogromna" baza 
danych ma 100 tabel ;-)

> Na wszelki wypadek zobrazuję co mam na myśli. Jakaś tabela, powiedzmy,
> że to "dokument", ma pola A, B i C. W trakcie pracy aplikacji klient
> zażyczył sobie mieć pole D, które np. ma zawierać ID do innej tabeli.
> Wchodzi w edytor rozszerzeń, dodaje sobie nowe pole i informuje system
> "to pole ma linkować do ID autora dokumentu" przykładowo. I co się wtedy
> dzieje:
>
> 1. W tabeli dodatkowych pól powstaje pole D, jego opisy etc.
W EAV nie dodaje się pola, tylko wiersz do tabeli definicji pola.
Na jego poziomie definiujesz nazwę, typ danych, constraint i link do 
relacji/obiektu biznesowego. Ja bym jeszcze dodał flagę określającą, czy 
dana wartość jest skalarna czy wektorowa.
A same wartości lecą do innej tabli, która jest połączona z tabelą 
definicji pola.
Ot i cała magia.

> 2. W tabeli wartości następuje skojarzenie w/w pola D z rekordem w
> tabeli "dokument" i w uniwersalnym typie text pola "wartość" jest
> przechowywana liczba oznaczająca ID użytkownika w tabeli userów. No ale
> raczej kiepsko byłoby budować indeksowanie na polu tekstowym, które raz
> jest liczbą a innym razem tekstem.
Zależy.
Ale po cholerę Ci indeks na tym polu?

> 3. Z w/w powodu dostawiamy pole danych D do tabeli "dokument" (lub
> tabeli powiązanej poprzez dziedziczenie - inherit)
Dziedziczenie w bazach relacyjnych? Ho, ho... można i tak, ale ja bym 
się w to nie bawił.
Oczywiście są bazy post-relacyjne lub obiektowo-relacyjne, które 
zapewniają rożne wsparcie do takich zabawek (mam na myśli OOP w ujęciu 
bazo-danowym).
Moim zdaniem - nie warto. Więcej z tym kłopotów niż pożytku.
Ale ja tam się na tym nie znam...

> już właściwego typu,
> czyli int4 i tworzymy na nim indeks (dynamicznie również - czyli z
> poziomu działania logiki aplikacji).
No i po co ten indeks?
Indeks należy dodać wtedy kiedy jest NIEZBĘDNY, a nie od razu bo może 
się przyda...
To tak jak testować aplikację z pusta bazą danych.
Tragedia...

> Zazwyczaj w polach rozszerzonych bardzo mało danych będzie
> przechowywanych (liczby, krótkie teksty) więc ich dublowanie nie będzie
> bolesne objętościowo. Jednocześnie otrzymujemy łatwy dostęp do tych
> danych poprzez select * from dokument, działają constrainy.
Constrainty (banał) i budowanie SQL (a tu zależy - może to być w miarę 
proste lub nie) możesz sobie załatwić po stronie aplikacji.
Napiszesz to raz i będzie działało z dowolnym typem dokumentu.
Tu nie ma co dywagować, tylko doczytać o EAV i zakodować.
Do roboty! ;-)

-- 
wloochacz
Technical Details
Message-ID: <54d8f45a$0$2214$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <mag0cl$o93$1@news.icm.edu.pl> <slrnmcqmva.5h7.tom@tv2.dom.local> <makuln$8ps$1@news.icm.edu.pl> <00393f98-4afb-4213-934d-9156200c7bcb@googlegroups.com> <mavv3h$n7l$1@news.icm.edu.pl> <8e718611-b061-4aaa-9fb0-1687681dcb94@googlegroups.com> <mb25li$mon$1@news.icm.edu.pl> <f6a66af6-182a-47d7-a297-7a1b998ebee2@googlegroups.com> <mb2g3c$isp$1@news.icm.edu.pl> <e64d3758-bdb8-4f73-b75a-3aa9b5f789e6@googlegroups.com> <54d5e7a7$0$2188$65785112@news.neostrada.pl> <1e428ab3-3e7f-4a50-a7b0-d5d458ad2a65@googlegroups.com> <54d66936$0$2206$65785112@news.neostrada.pl> <89a37815-f4ab-423f-bdc8-13ff32bb4f7e@googlegroups.com> <ac14966e-c0e4-498b-9257-25d1e6363d0b@googlegroups.com> <mbahen$9em$1@news.icm.edu.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Date: Mon, 09 Feb 2015 18:54:30 +0100
From: wloochacz <wloochacz@no.spam.gmail.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0
MIME-Version: 1.0
Newsgroups: pl.comp.bazy-danych
Subject: Re: PostgreSQL - jak najlepiej definiować
 dynamiczne pola?
References: <mag0cl$o93$1@news.icm.edu.pl> <slrnmcqmva.5h7.tom@tv2.dom.local> <makuln$8ps$1@news.icm.edu.pl> <00393f98-4afb-4213-934d-9156200c7bcb@googlegroups.com> <mavv3h$n7l$1@news.icm.edu.pl> <8e718611-b061-4aaa-9fb0-1687681dcb94@googlegroups.com> <mb25li$mon$1@news.icm.edu.pl> <f6a66af6-182a-47d7-a297-7a1b998ebee2@googlegroups.com> <mb2g3c$isp$1@news.icm.edu.pl> <e64d3758-bdb8-4f73-b75a-3aa9b5f789e6@googlegroups.com> <54d5e7a7$0$2188$65785112@news.neostrada.pl> <1e428ab3-3e7f-4a50-a7b0-d5d458ad2a65@googlegroups.com> <54d66936$0$2206$65785112@news.neostrada.pl> <89a37815-f4ab-423f-bdc8-13ff32bb4f7e@googlegroups.com> <ac14966e-c0e4-498b-9257-25d1e6363d0b@googlegroups.com> <mbahen$9em$1@news.icm.edu.pl>
In-Reply-To: <mbahen$9em$1@news.icm.edu.pl>
Lines: 98
Message-ID: <54d8f45a$0$2214$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 83.23.102.61
X-Trace: 1423504474 unt-rea-a-02.news.neostrada.pl 2214 83.23.102.61:50377
X-Complaints-To: abuse@news.neostrada.pl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit