2011-08-23 11 views
7

Buduję aplikację społecznościową, która ma następującą/następującą koncepcję podobną do twittera.Czy lepiej jest utrzymywać oddzielną tabelę liczników w porównaniu do bieżącego zapytania liczenia za każdym razem?

Z punktu widzenia wydajności, aby znaleźć nie więcej zwolenników i użytkowników, Czy lepiej jest zachować oddzielną tabelę zliczania? lub po prostu zrobić kwerendę za każdym razem?

Aktualizacja:

Podobnie mam rodzaju Badanie funkcjonalności, gdzie ludzie mogą głosować, ludzie mogą tylko Zagłosuj Tak lub Nie. Teraz jestem przechowywania głosów w osobnej tabeli. Muszę też wyświetlać listę ankiet, w których nie ma uczestników, nie ma odpowiedzi "tak" i "nie ma" na mojej stronie głównej.

Podobny do strony głównej stackoverflow (gdzie pokazuje liczbę głosów, odpowiedzi i wyświetleń).

Odpowiedz

7

To, jak większość rzeczy, zależy od wzorców dostępu, tj. Sposobu w jaki system będzie używany. Jeśli uaktualnienie będzie Twoim głównym wąskim gardłem, nie powinieneś zwiększać dodatkowego obciążenia poprzez konieczność utrzymywania licznika. Z drugiej strony, gdy dostęp do danych, które są gotowe do liczenia, pozwoli zaoszczędzić sporo czasu lub po prostu nie będzie możliwe policzenie za każdym razem, powinieneś go uprzedzić.

Jako ogólną wytyczną, nie dodawaj tabel, takich jak proponowana osobna tabela zliczania, które są przeznaczone wyłącznie do optymalizacji wydajności, zanim faktycznie zmierzysz wydajność jako problem. Posiadanie oddzielnej tabeli zliczania normalizuje normalizację (jak każdy rodzaj buforowania, ponieważ dane są teraz replikowane w dwóch miejscach) i sprawi, że kod będzie bardziej skomplikowany, dlatego nie powinno się tego robić tylko dlatego, że może być potrzebna liczba.

(Wszystko, co powiedzieliśmy, niektóre bazy danych obsługują materialized views/materialized queries, które umożliwiają łatwe wykonywanie tego rodzaju buforowania w tle, a zmaterializowane tabele są aktualizowane przez bazę danych, dzięki czemu kod programu nie musi się o to martwić, a także w zależności od zaawansowania optymalizator zapytań, mogą być wykorzystywane do optymalizacji kwerendy transparentnie)

Aktualizacja:. Tak/Nie oceniany pytanie jest nieco inna, ponieważ głównym celem jest po prostu śledzić liczbę , niekoniecznie cała informacja (tj. kto głosował tak). Tak więc ważną implementacją może być po prostu śledzenie skumulowanej liczby głosów "tak" i "nie". Jednak im więcej informacji przechowujesz (tj. Kto głosował tak, nie tylko wielu), tym więcej możesz z tym zrobić, jeśli zdecydujesz się na to (na przykład w Stackoverflow zawsze mogę usunąć moje wystąpienie - coś, czego nie możesz zrobić, jeśli nie śledziłeś, kto głosował). Ponownie zaleciłbym, aby w tym przypadku nie zagłuszać, ponieważ utracisz określone informacje.

+0

Dzięki pompagranti, Do głosowania przechowuję również pojedyncze rekordy. Mam ankietę i tabelę głosowania. Moja strona główna pokazuje więc listę ankiet z tekstem ankiety, liczbą uczestników, liczbą i liczbą. więc muszę zrobić zewnętrzne sprzężenie między ankietą a tabelą głosowania (zakładając, że nasza tabela głosowania wzrośnie z upływem czasu). Więc myślisz, czy to jest w porządku, aby dołączyć zewnętrzne z tabelą głosowania? – firefly

+0

@mrbond: W przypadku kilku tysięcy ankiet nie widzę problemu. To zawsze kwestia wielkości. Możesz również buforować poszczególne ankiety na serwerze aplikacji, jeśli zajdzie taka potrzeba (nie musisz nawet komunikować się z serwerem dla 100 najbardziej poszukiwanych ankiet). Ale znowu, jeśli nie wiesz, że to będzie problem, nie będę go przedwcześnie agregował. Jeśli zauważysz, że to staje się problemem, powinieneś być w stanie zareagować na czas, ponieważ nie jest to poważna zmiana projektu (a ponieważ nie zoptymalizowałeś przedwcześnie, łatwiej też się przystosować). –

2

To zależy.

Jeśli masz wielu użytkowników, liczba może być dość długa i załadować duże części tabeli/indeksów do pamięci.

Jeśli zrobisz trigera, stracisz trochę czasu w procesie formowania, więc każde następne działanie zostanie zwolnione o kilka sekund.

Mieszanie między tymi dwoma, asynchroniczne podawanie tabeli statystyk o obserwujących może dać najlepsze wyniki (szybkie operacje zapisu, wyjątkowo szybkie podczas czytania).

0

Alternatywnie, można korzystać z dwóch pojemników danych:

  • znormalizowana bazy danych dla kompletnych danych, które można przeczytać, jeśli chcesz wyświetlić dane profilowe Pełny
  • indeks wyszukiwania (Solr/Lucene dla przykład) z najczęściej wyświetlanymi danymi, w tym z agregatami takimi jak zliczenia, których używasz do szybkiego wyświetlania i do wyszukiwania
Powiązane problemy