Tomasz Wójtowicz

Tomasz Wójtowicz Programista Ruby on
Rails

Temat: Komentarze - schemat bazy

Witam,

Mam do rozwiązania pewien problem. Serwis nad którym pracuję ma mieć możliwość udostępniania dodawania komentarzy zarówno dla zalogowanych jak i dla niezalogowanych użytkowników. Stanąłem na schemacie bazy danych. Mam tabele comments oraz tabele users. Generalnie chodzi o to ze dla zalogowanych sprawa jest jasna. Powiązanie jeden do wielu między users a comments. Ale jak rozwiązać sprawę z niezalogowanymi użytkownikami? Jedyne co mi do głowy przychodzi do w tabeli users mieć użytkownika o nazwie Gość i każdy komentarz niezalogowanego użytkownika jest powiązany z tym Gościem. Do tabeli comments musiałbym dodać pole username, w którym byłaby informacja o nazwie użytkownika. W tym przypadku musiałbym też wpisywać do tego pola w tabeli comments również username użytkowników zalogowanych(żeby nie było w tym polu NULL'a dla komentarzy dodanych przez zalogowanych. Doprowadza to do nadmiarowości danych, możliwość niespójności danych no i do denormalizacji. I właśnie nie wiem czy można tak zrobić czy jest na to jakiś lepszy sposób :)

Czekam na jakieś uwagi, opinie, sugestie :)

PozdrawiamTomasz Wójtowicz edytował(a) ten post dnia 06.02.11 o godzinie 23:32
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Komentarze - schemat bazy

Tomasz Wójtowicz:
Powiązanie jeden do wielu między users a comments.
Ale jak rozwiązać sprawę z niezalogowanymi użytkownikami? Jedyne co mi do głowy przychodzi do w tabeli users mieć użytkownika o nazwie Gość i każdy komentarz niezalogowanego użytkownika jest powiązany z tym Gościem.

Sam sobie odpowiedziałeś :)
Do tabeli comments musiałbym dodać pole username, w którym byłaby informacja o nazwie użytkownika.

A czemu?
Wystarczy przecież w tabeli comments mieć id_comment jako klucz główny i id_user jako klucz obcy... Sam powiedziałeś - relacja 1 do N
Tomasz Wójtowicz

Tomasz Wójtowicz Programista Ruby on
Rails

Temat: Komentarze - schemat bazy

Grzegorz Drzymała:
A czemu?
Wystarczy przecież w tabeli comments mieć id_comment jako klucz główny i id_user jako klucz obcy... Sam powiedziałeś - relacja 1 do N

No ale jak komentarz dodaje niezalogowany, to gdzie mam przechowywać jego nick? Niby to jest gość ale przecież trzeba zapisywać jego nick gdzieś
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Komentarze - schemat bazy

W tabeli users dodajesz jeden wiersz dla użytkownika "Gosc".
Ewentualnie, jeżeli nie chcesz trzymać gościa w tabeli users to dodajesz sam wpis do tabeli comments z pustym id_user.Grzegorz Drzymała edytował(a) ten post dnia 07.02.11 o godzinie 00:23

konto usunięte

Temat: Komentarze - schemat bazy

Tomasz Wójtowicz:
Grzegorz Drzymała:
A czemu?
Wystarczy przecież w tabeli comments mieć id_comment jako klucz główny i id_user jako klucz obcy... Sam powiedziałeś - relacja 1 do N

No ale jak komentarz dodaje niezalogowany, to gdzie mam przechowywać jego nick? Niby to jest gość ale przecież trzeba zapisywać jego nick gdzieś

Możesz dodać pole comments.nick VARCHAR(x) NULL
i wypełniać je tylko jeśli użytkownik jest niezalogowany.
Grzegorz D.

Grzegorz D. PL/SQL Developer

Temat: Komentarze - schemat bazy

Na początku myślałem, że chcesz, aby każdy komentarz użytkownika niezalogowanego otrzymał nick "gość". Teraz dopiero doczytałem, że tak nie jest. W takim wypadku dobrą odpowiedź dał wg mnie Piotr.
Patryk Szczepański

Patryk Szczepański Projektowanie i
implementacja
systemów
komputerowych

Temat: Komentarze - schemat bazy

W moim systemie zrobione jest to tak:

Tabela Uzytkownicy przechowuje dane userów potrzebne do logowania, tabela DaneUzytkownikow pozostałe dane i tam mam wiersz dla użytkowników anonimowych. W tabeli Uzytkownicy jest kolumna typu BIT "czyZalogowany" i jeśli tak (wartość 1) to jest też referencja do danych konkretnego usera, inaczej (wartość 0) jest referencja do danych usera anonimowego.

Wszystko zależy od przyrostu danych - ale jeśli nie jest to milion wierszy tygodniowo to po utworzeniu odpowiednich indeksów powinno być ok. U mnie jest to ok. 300 wpisów dziennie i puki co wszystko działa ok (8 miesiąc).
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: Komentarze - schemat bazy

Koledzy... Zakombinowaliście nieco. Pierwsza rzecz to nie wiadomo o jaki model bazy chodzi. Jeżeli pod uwage brany jest mysql z tabelami typu (cyba) myISAM to rozwiazanie z dodaniem usera anonimowego jest jak najbardziej trafne.

Jezeli jednak jest to inna niz MySQL baza to proponuje na tabeli comments stworzyć klucz głowny na dwoch kolumnach (id, id_user) a interface użytkownika zrobic tak ze anonimowe dodawanie komentarza powoduje wpisanie nulla do id_user. Teraz przy wyswietlaniu komentarzy kazdy id_user is null to uzytkownik anonimowy.

Jak widzimy nie trzeba tworzyc dodatkowego uzytkownika...Marcin Mackiewicz edytował(a) ten post dnia 09.02.11 o godzinie 20:23
Patryk Szczepański

Patryk Szczepański Projektowanie i
implementacja
systemów
komputerowych

Temat: Komentarze - schemat bazy

A co z nick-ami niezalogowanych userów? Przecież przy postach zawsze jest wyświetlany nick autora i taka była intencja pytania...

konto usunięte

Temat: Komentarze - schemat bazy

Patryk Szczepański:
A co z nick-ami niezalogowanych userów? Przecież przy postach zawsze jest wyświetlany nick autora i taka była intencja pytania...

przecież już wszystko było powiedziane
1. w tabeli comment dodatkowe pole user_name
2. jak user zalogowany to comment.user_id odpowiedni id i user_name = null
3. jak gość to comment.user_id = null i user_name = nick

z tego banalnie prosto w zapytaniu wyciągnąć nick niezależnie od tego czy komentarz dodał user czy gość.
Tomasz Wójtowicz

Tomasz Wójtowicz Programista Ruby on
Rails

Temat: Komentarze - schemat bazy

Michał Misiekd:
2. jak user zalogowany to comment.user_id odpowiedni id i user_name = null

Zrobie chyba jednak tak, że jak zalogowany to przy user_id odpowiedni id ale przy user_name jego name z tabeli users.

konto usunięte

Temat: Komentarze - schemat bazy

Tomasz Wójtowicz:
Michał Misiekd:
2. jak user zalogowany to comment.user_id odpowiedni id i user_name = null

Zrobie chyba jednak tak, że jak zalogowany to przy user_id odpowiedni id ale przy user_name jego name z tabeli users.

Ważniejsze raczej żeby zawsze było wypełnione user_id (dla gości stałym ID).
Bo złączenia dzięki temu będą prostsze.
Natomiast nazwę użytkownika i tak z reguły jakoś potem obrabiasz w programie i nadmiarowo ją wypełniać - trochę szkoda miejsca w bazie.
Jacek Hełka

Jacek Hełka CCA Europe.pl Sp. z
o. o.

Temat: Komentarze - schemat bazy

A nie przyszło Ci do głowy, żeby nick był kluczem głównym usera?
Wtedy w tabeli comments można by było używać nicka jako klucza obcego, a w przypadku niezalogowanego użytkownika po prostu na nic by nie wskazywał (ale oczywiście nie ustawiasz wtedy więzów).

Jeżeli wyświetlasz komentarz z samym tylko nickiem, w ogóle nie potrzebujesz robić złączeń.

Oczywiście jeżeli tak czy owak chcesz pociągnąć jakieś inne dane z profilu użytkownika, to korzyść nie jest już taka duża.
Robert Nodzewski

Robert Nodzewski Tworzenie serwisów
www oraz paneli do
zarządzania/raporto.
..

Temat: Komentarze - schemat bazy

Jacek Hełka:
A nie przyszło Ci do głowy, żeby nick był kluczem głównym usera?
Wtedy w tabeli comments można by było używać nicka jako klucza obcego, a w przypadku niezalogowanego użytkownika po prostu na nic by nie wskazywał (ale oczywiście nie ustawiasz wtedy więzów).
A jak gość poda nick który już posiada jakiś user zarejestrowany?

Jeżeli wyświetlasz komentarz z samym tylko nickiem, w ogóle nie potrzebujesz robić złączeń.
Tak, tylko wtedy musisz pamiętać o aktualizacji danych, gdy np. zalogowany user zmieni nick.

Dyskusja ciągle zatacza koło od nowa. Było już milion razy powiedziane jak ma być a mimo wszystko ciągle i ciągle jest to wałkowane :/
Ostatnie podsumowanie podał Michał:
przecież już wszystko było powiedziane
1. w tabeli comment dodatkowe pole user_name
2. jak user zalogowany to comment.user_id odpowiedni id i user_name = null
3. jak gość to comment.user_id = null i user_name = nick
z tego banalnie prosto w zapytaniu wyciągnąć nick niezależnie od tego czy komentarz dodał user czy gość.
Po co to jeszcze drążyć?

konto usunięte

Temat: Komentarze - schemat bazy

Trochę nie na temat (niech autor wątku nie czyta). Jeśli chodzi o forum to mam taki pomysł na gości, żeby nazywać ich gość_"ops
is". Opis można by pobierać ze słownika - oddzielna tabelka np z nazwami kwiatków i zapisywać w ciasteczkach. Jak się zaczną powielać dodawać jeszcze cyferki. Póki użytkownik ciasteczek nie wyczyści lub się nie zaloguje można by śledzić jakąś ciągłość.



Wyślij zaproszenie do