Porada dotycząca przechowywania danych w bazie

0

Witajcie,
Mam 2 tabele. W 1 trzymam historię przeglądania użytkowników w postaci
ID_PRZEGLĄDANIA, ID_USERA, URL_STRONY, CZAS, IP, ID_SESJI,
a w 2 historię logowań użytkowników w postaci
ID_LOGOWANIA, ID_USERA, REZULTAT (powodzenie, porażka), CZAS, ID_SESJI.
Wynikiem zapytania ma być adres ip dla konkretnego logowania. Można to zrobić np. w taki sposób

SELECT historia_przegladania.IP FROM logowania JOIN historia_przegladania ON historia_przegladania.ID_SESJI = logowania.ID_SESJI WHERE historia_przegladania.URL_STRONY = "Adres strony na ktorej sprawdzana jest poprawnosc formularza" AND logowania.ID_LOGOWANIA = 1 GROUP BY logowania.ID_LOGOWANIA;

I tutaj pojawia się mój dylemat. Co waszym zdaniem jest lepsze?

  1. Wyciągania tego za pomocą takiego zapytania
  2. Trzymanie dodatkowego pola z adresem ip w tabeli z logowaniami i duplikowanie informacji nt. adresu ip

Proszę o wskazówki :)

Pozdrawiam

0

wg mnie, to trzymaj to w jednej tabeli

0

a co to jest to przeglądanie i jak to się ma do logowania? Czy np. na jedno logowanie może być 100 przeglądań?

0

1 przeglądanie = 1 odwiedzona strona przez usera.
Może być, ale jestem w stanie określić, które to przeglądanie na podstawie adresu odwiedzonej strony. Ogólnie wydaje mi się że opcja 1 jest wygodniejsza, ponieważ gdy bd potrzebował adresu ip usera, który wypełnił formularz x na adresie y, nie będę musiał trzymać dodatkowego adresu ip dla tego fomularza, tylko wystarczy że zrobię selecta i znajdę go na podstawie strony (o adresie y) i ew. daty (jeżeli formularz będzie mógł być wypełniany więcej niż raz na jedno zalogowanie).
Z drugiej strony takie joinowanie dość dużej tabeli, bo zawierającej historię odwiedzanych stron przez użytkowników oraz szukanie w niej informacji na podstawie stringa będzie trwało długo.
Jak widzicie mam 2 opcje i nie za bardzo mogę się zdecydować, która lepsza

0

jeśli jest to 1 do 1 to po co rozbicie na dwie tabele?

0

Chodziło mi o to że 1 przeglądanie = 1 rekord w bazie z przeglądaniami. Podczas 1 logowania przeglądań może być wiele. To konkretne przeglądanie, które wiąże się z logowaniem mogę wyciągnąć na podstawie adresu formularza logowania i ew, jeżeli takich zdarzeń będzie więcej podczas jednego logowania na podstawie czasu - bo ten mam w 2 tabelach

0

IP powinno być raczej w tabeli z logowaniami, bo może istnieć nawet dla tych co próbują się zalogować.
Jeśli chcesz śledzić sesje niezalogowane to IP powinno być także w tabeli historia_przegladania lub jeśli IP nie może się zmienić w danej sesji - w tabeli "sesje_przegladania" (IP, ID_SESJI).

Jeśli nie masz miliona odsłon dziennie to po prostu użyj listy pól z Apache Log:
patrz "Common Log Format" tutaj: http://httpd.apache.org/docs/1.3/logs.html

Łatwiej coś takiego skanować pod różnym kątem, tablice raportowo-relacyjne możesz sobie okresowo z tego generować.

0

Śledzę wszystkie sesję i te zalogowane i nie. Sesje są trzymane w tabeli w postaci: ID_SESJI, ID_USERA (null jeżeli jest to sesja dla użytkownika nie zalogowanego), TOKEN_SESJI, CZAS_UTWORZENIA. Do tego dochodzi tabela z przeglądaniami, w której trzymam historię użytkowników zalogowanych i nie w postaci: ID_PRZEGLĄDANIA, ID_SESJI, ADRES_STRONY, CZAS, IP i tabela z logowaniami ID_LOGOWANIA, ID_SESJI, CZAS, REZULTAT, ID_USERA (id usera, na którego się zalogowano lub próbowano się zalogować). Mając te dane jestem w stanie wyciągnąć ip dla każdego logowania czy to udanego czy nie odpowiednio dołączając tabelę z sesjami, do niej tabelę z historia przeglądania i wybrać rekord gdzie id usera, strona przeglądania jest taka sama jak strona logowania oraz data jest taka sama jak w rekodzie z historią przeglądania i data logowania.

Trzymając IP w tabeli z logowaniami defacto będzie ono zduplikowane, ale potem będę mógł je łatwiej wyciągać nie wykonując skomplikowanych zapytań na chyba największej tabeli - tabeli z historią przeglądania. Dane te będą mi potrzebne na razie tylko i wyłącznie w panelu użytkownika, gdzie będzie mógł on podglądnąć swoją historię logowań. Z tego też powodu dane te nie będą często wyświetlane.

Reasumując, mam 2 wyjścia.
Trzymać niepotrzebnie zdublowane dane, tracić na nie niepotrzebnie miejsce kosztem szybkiego ich wyświetlenia.
Trzymać dane nie zdublowane, nie tracić miejsca, kosztem dłuższego ich wyświetlenia

1 użytkowników online, w tym zalogowanych: 0, gości: 1