adbacz
30.05.2011, 13:39:48
Mam system oceniania dla artykułów. Oceny zapisuję w osobnej tabeli z ocenami poza tabelą z artykułami. Każda ocena jest zapisywana w jednym wyniku oddzielona znakiem |;;|. Tak samo jest z adresami IP, do sprawdzania czy juz ten ktos ocenił dany artykuł.
Żeby obliczyć średnią albo sprawdzić czy już było ocenione, pobierałem jeden wynik, za pomocą explode() wszystko rozbijałem i operowałem na tablicy.
Moje pytanie brzmi, czy to jest dobre rozwiązanie? Teraz, przy robieniu porównywarki, chciałem porównywać też oceny wyświetlając je w tabeli. Wszystko wygląda tak, że wyświetlane jest wszystkow postaci tabeli na stronie, która generowana jest przez pętlę, i dla każdego wykonania pętli, pobierało z bazy day wynik z ocenami, rozbierało go, liczyło średnią i wyświetlało ocenę... tak, ale tylko przy pierwszym przejściu pętli.
Jest jakiś lepszy sposób przechowywania ocen? Może każdą w osobnym wyniku, ale czy to czasem nie marnotrawstwo przestrzeni dla DB? Albo to samo tylko, że zamiast w osobnej tabeli, to w tabeli razem z artykułami?
plej
30.05.2011, 13:47:21
w jednej i łączyć je kluczem głównym czyli "id"
napisz sobie funkcje która odrazu będzie zliczała średnią ocenę i dodawała gotowy wynik do bazy:) albo nawet w jednej tabeli możesz mieć to:D
mortus
30.05.2011, 13:59:18
Zdecydowanie najbardziej optymalne będzie przechowywanie ocen w osobnej tabeli w bazie danych. Jednak ważne jest to, jak to ocenianie wygląda. Jeśli oceniać mogą tylko dajmy na to zarejestrowani użytkownicy portalu, to nie ma sensu sprawdzać tutaj IP. Jeśli natomiast oceniać mogą wszyscy, to samo sprawdzenie IP nie wystarczy (niektórzy mogą mieć IP zewnętrzne, takie samo dla kilku, czy nawet kilkuset użytkowników sieci lokalnej lub WiFi). W obu przypadkach najlepiej będzie wykorzystać nową tabelę w bazie danych i nałożyć PRIMARY KEY na oba pola tabeli. Przykładowo:
CREATE TABLE `oceny` (
`article_id` int(10) UNSIGNED NOT NULL,
`user_id` int(10) UNSIGNED NOT NULL,
PRIMARY KEY (`article_id`,`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
adbacz
30.05.2011, 14:10:46
Dać sobie spokój z funkcją explode()? Co do oceniania to mogą oceniać tylko zarejestrowani, więc w sumie masz rację mortus.
mortus
30.05.2011, 14:34:44
Cytat(adbacz)
Dać sobie spokój z funkcją explode()?
Zdecydowanie tak.
adbacz
30.05.2011, 15:27:07
Dzięki Panowie, teraz jest wszystko w porządku