Dovrei usare una tabella separata per archiviare gli utenti online o dovrei semplicemente usare campi aggiuntivi nella tabella dei membri esistenti?

StackOverflow https://stackoverflow.com/questions/1445617

  •  22-07-2019
  •  | 
  •  

Domanda

Sto lavorando a un sistema online che consente agli utenti di interagire socialmente e ovviamente sarà importante essere in grado di identificare gli utenti che sono effettivamente online. So che HTTP è apolide e conosco l'utilizzo delle sessioni, quindi dovrò farlo confrontando l'ultimo tempo attivo di un utente con un tempo di scadenza arbitrario.

La mia ultima domanda si riduce a questo: Devo solo aggiungere alcuni campi alla tabella dei membri esistenti ( last_active_time , is_user_online , hide_online_status , ecc.) O sarebbe meglio conservare queste informazioni in una tabella separata? Il mio pensiero iniziale è di usare la tabella esistente per semplicità. A parte il livello di complessità, quali sono i vantaggi / gli svantaggi di uno rispetto all'altro?

È stato utile?

Soluzione

Lo terrei all'interno di una tabella separata. Se hai un milione di utenti e vuoi sapere chi è online, non vuoi scansionare quella tabella più e più volte per trovare quelle informazioni. Il tuo " online " la tabella sarà relativamente piccola e puoi avere un lavoro che lo scansiona periodicamente per quelli che non sono arrivati ??negli ultimi 5 minuti circa e quindi semplicemente cancellarli dalla tabella online e aggiornare tutto il necessario nella tabella dei membri per " last_seen " ;

Altri suggerimenti

Crea una nuova tabella.

In primo luogo, c'è la ragione filosofica, che è che un oggetto (leggi: tabella) dovrebbe avere uno scopo. Ciò si confonde molto nella progettazione logica del database, ma è comunque un buon principio.

Ma le vere ragioni derivano dalla progettazione fisica: in primo luogo, si può presumere che il numero di utenti che accederanno in qualsiasi momento sia molto inferiore al numero totale di utenti, quindi i requisiti di archiviazione saranno inferiori. E requisiti di archiviazione inferiori si traducono direttamente in un carico ridotto sul database, semplicemente perché hai meno blocchi da leggere e aggiornare.

Se metti questi dati nella tua tabella principale, inoltre, quei blocchi saranno sparsi su uno spazio molto più ampio e il contenuto dei blocchi crescerà e si ridurrà continuamente mentre cambi i dati.

E infine, probabilmente avrai bisogno di alcuni indici, ad esempio per vedere chi è online adesso. E quegli indici occuperanno (1) ancora più spazio, (2) creeranno blocchi sporchi ancora più sparsi che devono essere scritti fisicamente su disco e (3) introducono un punto di contesa di aggiornamento.

Penso che dipenda da quanti utenti ti aspetti di avere. Se ci saranno solo un paio di migliaia di utenti, renderei lo stato online un attributo di un utente, nella tabella degli utenti. Se ci sarà più di questo, allora vorrai una tabella online_users e manterrai quelle informazioni lì, con una chiave esterna nella tabella degli utenti principali. Per ottenere i benefici (menzionati dai poster sopra), ti consigliamo di eseguire un'attività ogni poche ore per rimuovere gli utenti inattivi dalla tabella online_users.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top