konto usunięte

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

Otóż mam program.

W programie użytkownik jest zalogowany do jakiejś grupy i wszystko co widzi to zawartość danej grupy - newsy, wydarzenia,pliki itp.

Jak to rozwiązać na poziomie bazy danych?
Czy przechowywać wszystkie newsy, wydarzenia, inf o plikach w jednej tabeli ( w sensie NEWS, EVENTS, FILES - każdy typ informacji w osobnej tabeli ) i oznaczać je identyfikatorem grupy i potem serwer będzie zwracał klientowi informacje oznaczone właśnie jego identyfikatorem grupy,
czy może tworzyć nowe tabele dla każdej grupy i pobierać dane z tabel "prefiks+NEWS" , "prefiks+EVENTS" itp ?

konto usunięte

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

Marek Urbanowicz:
czy może tworzyć nowe tabele dla każdej grupy i pobierać dane z tabel "prefiks+NEWS" , "prefiks+EVENTS" itp ?

Musisz rozważyć proporcje w ilości danych. Chociaż przy ilości rekordów liczonych w tysiącach to może nie być dużo, ale jeśli planujesz tysiące odwiedzin to może już być :)

Jeśli we wszystkich tabelach będziesz miał niewielkie proporcjonalnie różnice w ilości danych oraz nie będzie tam zbyt wiele megabajtów, a będą one tylko dodawane i nie aktualizowane to może opłacić się tworzenie osobnych tabel.

Jednak gdyby grup nie było zbyt dużo, a były one stosunkowo duże objętościowo to bardziej opłacalne może się okazać pobieranie ich z jednej tabeli indeksowanej po numerze/nazwie grupy.

Powiem ci szczerze, że nie robiłem nigdy żadnych testów wydajnościowych PostgreSQL'a. Musisz sam "zakombinować" z czym daje on sobie lepiej radę.

Po prostu zrób kilkaset tabel po 5000 wierszy i pobieraj z nich dane, a w drugim teście zrób jedną tabelę z kilkaset*5000 wierszy i powtórz test.

Jednak przy dobrym wydajnościowo serwerze może się okazać, że najlepsze będzie to rozwiązanie, przy którym mniej się narobisz :)
Jakub L.

Jakub L. Programista

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

A zakładasz możliwość nakładania się grup? Albo dynamiczne ich tworzenie i usuwanie?
Możesz potestować z także widoki z jednej dużej tabeli w której trzymane jest wszystko.

konto usunięte

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

tak, grupy będą tworzone i usuwane. w jakim sensie nakładanie?
Michał Bogdan

Michał Bogdan Oracle DBA, Acxiom
Polska

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

jest też rozwiązanie pośrednie, pomiędzy jedną tabelą, a tabelą per grupa..

to jest partycjonowanie

co prawda nie bawiłem się tym w Postgresql, ale doc'e pokazują, że postgresql też to umi http://www.postgresql.org/docs/8.1/interactive/ddl-par..., a przynajmniej potrafi symulować partycjonowanie zbiorem reguł i triggerów.

możesz z czymś takim ustalić, że grupy z id <0,1000) wpadają do partycji numer jeden, z id <1000,2000) do partycji numer dwa itp..

oczywiście dane najlepiej partycjonować po takiej kolumnie - która poźniej najcześćiej będzie występowała w sekcji WHERE zapytania sql :)Michał Bogdan edytował(a) ten post dnia 18.11.08 o godzinie 18:29
Zbigniew R.

Zbigniew R. Kierownik Działu IT,
SKOK Kujawiak

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

Marek Urbanowicz:
[...] w jakim sensie nakładanie?

Użytkownik należy do kilku grup?

konto usunięte

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

nie.do jednej.
Marcin K.

Marcin K. Programowanie jest
moim powołaniem,
Alleluja

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

Jak wszystko przechowywać w jednej tabeli?
To nie jest koncepcja relacyjnych baz danych!!!

Jeśli masz NEWS, EVENTS, FILES, GROUPS, ACCESS to do każdego musisz utworzyć tabelę i powiązać je ze sobą kluczami PRIMARY i FOREIGN KEY. Zawsze musisz dbać o spójność bazy. A jeśli w dodatku robisz to w języku JAVA EE to jeden Entity Bean na jedną tabelę w aplikacji by zachować wzorzec projektowania. Pamiętaj, by osoba, która będzie zajmowała się tym po Tobie rozczytała się w kodzie.(no chyba, że to zawsze będziesz Ty).

Polecam zajrzeć do gotowych rozwiązań w tej tematyce takich jak Wordpress,jomla itp. Może jezyk programowania jest inny, ale nie w tym rzecz. Każda struktura bazy będzie zbudowana podobnie co do przechowywanych danych.
Magdalena Łach

Magdalena Łach AX senior developer

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

Marcin Kossak:
Jak wszystko przechowywać w jednej tabeli?
To nie jest koncepcja relacyjnych baz danych!!!
a ja Tobie polecam poszukac informacji na temat celowej denormalizacji baz danych...

co do pytania - zalezy czy jest to projekt studencki, czy realny problem... na studiach, wiadomo obowiazuje model czysto relacyjny;)
Marcin K.

Marcin K. Programowanie jest
moim powołaniem,
Alleluja

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

Denormalizacja jasne czemu nie ;) temat powszechnie znany ;P tylko oczywiście trzeba mieć umiar. Zastosowanie jednej tabeli zgodzisz się ze mną iż będzie to nierozsądne.

Magda plusik dla Ciebie ;)

konto usunięte

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

nie o to mi chodiziło.wszystkie newsy itp beda w osobnych tabelach ale bbeda mialy FK do grupy :) dzieki.pozdrawiam
Marcin Kossak:
Jak wszystko przechowywać w jednej tabeli?
To nie jest koncepcja relacyjnych baz danych!!!

Jeśli masz NEWS, EVENTS, FILES, GROUPS, ACCESS to do każdego musisz utworzyć tabelę i powiązać je ze sobą kluczami PRIMARY i FOREIGN KEY. Zawsze musisz dbać o spójność bazy. A jeśli w dodatku robisz to w języku JAVA EE to jeden Entity Bean na jedną tabelę w aplikacji by zachować wzorzec projektowania. Pamiętaj, by osoba, która będzie zajmowała się tym po Tobie rozczytała się w kodzie.(no chyba, że to zawsze będziesz Ty).

Polecam zajrzeć do gotowych rozwiązań w tej tematyce takich jak Wordpress,jomla itp. Może jezyk programowania jest inny, ale nie w tym rzecz. Każda struktura bazy będzie zbudowana podobnie co do przechowywanych danych.
Marcin K.

Marcin K. Programowanie jest
moim powołaniem,
Alleluja

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

Jeśli będziesz miał problem podczas budowy samej bazy możesz przesłać mi na adres mail Twoją propozycje i zrobimy burzę mózgów.

konto usunięte

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

Marek Urbanowicz:
nie o to mi chodiziło.wszystkie newsy itp beda w osobnych tabelach ale bbeda mialy FK do grupy :) dzieki.pozdrawiam
[...]
Jak jest część wspólna i dane będą wspólnie prezentowane - to może zrobić dziedziczenie? Hibernate ma taki bajer.

Co do samego projektu. Też jestem za trzymaniem różnych bytów w osobnych tabelach. To bardzo ułatwia życie adminowi. ;)

konto usunięte

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

kurcze..
wszystko już prawie mam.
został jeden problem.
jednak chcę żeby użytkownik mógł należeć do kilku grup.
teraz pytanie :
jak to zrobić? chyba trzeba by stworzyć tabelę "członkostwa" i jakoś powiązać ją z tabelą użytkownik lub nie..?
członkostwo musi mieć pole "aktywne" oraz "ban"(ewentualnie przyczyna bana) i program w momencie logowania do grupy którą użytkownik wybierze sprawdzi w tabeli "członkostwa" potrzebne informacje.
Będzie w porzadku takie rozwiązanie czy jakoś inaczej powinienem to zrobić żeby było zgodnie z zasadami ? :)
Marcin K.

Marcin K. Programowanie jest
moim powołaniem,
Alleluja

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

Można dodać nową tabelę z polami:

id_uzytkownika
id_grupy
opis
stan (ENUMERATE 'Y','N' default 'N') - Y jako aktywny N- jako nieaktywny
ban (ENUMMERATE 'Y','N' default 'N') - Y jako zbanowany N- analogicznie

pola wyboru typu dla postges-a:
check (stan in ('Y', 'N'))
check (ban in ('Y', 'N'))

w tabeli z grupami dodac kolumne default z polem typu boolean (0/1) jako grupa domyslnie przyznawana podczas rejestracji nowej osobyMarcin Kossak edytował(a) ten post dnia 20.11.08 o godzinie 15:18
Magdalena Łach

Magdalena Łach AX senior developer

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

Marcin Kossak:
Można dodać nową tabelę z polami:

id_uzytkownika
id_grupy
opis
stan (ENUMERATE 'Y','N' default 'N') - Y jako aktywny N- jako nieaktywny
ban (ENUMMERATE 'Y','N' default 'N') - Y jako zbanowany N- analogicznie

kolumna stan nie jest potrzebna - juz sama obecnosc rekordu, moze swiadczyc o tym, ze stan jest Y(1).
jezeli ban jest zakladany na grupe, to mozna "scalic" kolumny stan i ban i wtedy:
jezeli user jest w grupie i nie jest zbanowany to status = 1/Y.
jezeli user jest w grupie i jest zbanowany, to status = -1/B.
jezeli usera nie ma w grupie, to nie ma w ogole wpisu.
w tym rozwiazaniu mozna dodatkowo wprowadzac nowe "statusy" - np admina na grupe

konto usunięte

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

status jest potrzebny ponieważ uzytkownik sklada wniosek o czlonkostwo w grupie i juz wtedy rekord będzie ale admin musi mu przyznać to członkostwo.

konto usunięte

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

jeszcze pytanie. w sumie zupełnie już nie na temat ale.

id nazwa haslo imie nazwisko miasto data_urodzenia data_rejestracji email global_ban gg skype

to pola uzytkownika.
czy na pewno wystarczą? czy czegoś nie przeoczyłem?
program jest projektem społecznosciowym dla studentów roznych kierunkow, dla budowania komunikacji wewnatrz kierunku.
czy jakieś pola powinny zostać dodane?
Marcin K.

Marcin K. Programowanie jest
moim powołaniem,
Alleluja

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

brak informacji o kierunku, wydziale, uczelni studenta bo takie powinny być wnioskując z tego co podałeś ;)

konto usunięte

Temat: Pewien problem bazodanowy - PostgreSQL + JAVA ( Hibernate)

Witam.
Magdalena Łach:
Marcin Kossak:
Można dodać nową tabelę z polami:

id_uzytkownika
id_grupy
opis
stan (ENUMERATE 'Y','N' default 'N') - Y jako aktywny N- jako nieaktywny
ban (ENUMMERATE 'Y','N' default 'N') - Y jako zbanowany N- analogicznie

kolumna stan nie jest potrzebna - juz sama obecnosc rekordu, moze swiadczyc o tym, ze stan jest Y(1).
jezeli ban jest zakladany na grupe, to mozna "scalic" kolumny stan
Ciekawe podejście ;)
i ban i wtedy:
jezeli user jest w grupie i nie jest zbanowany to status = 1/Y.
jezeli user jest w grupie i jest zbanowany, to status = -1/B.
A nie przypadkiem = 1/B ?
jezeli usera nie ma w grupie, to nie ma w ogole wpisu.
pod waruniem, że nie = 0/B?
w tym rozwiazaniu mozna dodatkowo wprowadzac nowe "statusy" - np admina na grupe
Jest jakiś sensowny zysk wynikający z takiego scalenia?

Marek:
Ja bym tabele użytkownika rozbił na dwie. Jedna z podstawowymi informacjami do złączenia a druga z danymi adresowymi, telefonami, hasłem etc.

gn8.
Rafał.Rafał Wardas edytował(a) ten post dnia 21.11.08 o godzinie 02:30

Następna dyskusja:

[postgresql] Problem z inde...




Wyślij zaproszenie do