Modello di database per tenere traccia di Mi piace / condivisioni / commenti sui post del blog nel tempo

6

Il mio obiettivo è quello di tenere traccia dei post popolari su diversi siti di blog basati sull'attività dei social network in qualsiasi momento. L'obiettivo non è semplicemente ottenere il più popolare ora, ma invece trovare post che sono popolari rispetto ad altri post sullo stesso blog. Ad esempio, seguo un blog di tecnologia, un blog di sport e un blog di gossip. Il blog tecnologico ottiene più lettori degli altri due blog, quindi nei numeri grezzi ogni post sul blog della tecnologia vedrà sempre le visualizzazioni dei numeri sugli altri due. Quindi diciamo che il post del blog tecnologico medio ottiene 500 Mi piace su Facebook e gli altri due ricevono una media di 50 Mi piace per post. Poi, quando c'è un post sul blog sportivo che ha 200 Mi piace e un post sul blog di gossip con 300 mentre i post del blog tecnologico hanno 500 mi piace voglio evidenziare i post sul blog di sport e pettegolezzi (più Mi piace rispetto al blog medio con più # di Mi piace ma solo nella media per il blog)

L'approccio che sto pensando di fare è creare una voce in un database per ogni post del blog. Ogni x minuti (diciamo ogni 15 minuti) controllerò quanti like / condivisioni / commenti hanno ricevuto una voce su tutti i social network (facebook, twitter, google +, linkeIn). Quindi nel tempo ci sarà una storia di Mi piace per ogni post del blog, cioè

   post 1234 

        after 15 min: 10 fb likes, 4 tweets, 6 g+
        after 30 min: 15 fb likes, 15 tweets, 10 g+
        ...
        ...
        after 48 hours: 200 fb likes, 25 tweets, 15 g+

Tenendo una cronologia come questa per ogni post del blog, posso conoscere il numero medio di Mi piace / condivisioni / tweet in qualsiasi intervallo di tempo. Quindi, ad esempio, il numero medio di Mi piace per tutti i post del blog 48 ore dopo la pubblicazione è 50, e un particolare post ne ha 200 Posso contrassegnarlo come post popolare e metterlo in evidenza / evidenziarlo. Una considerazione nel design è di essere in grado di interrogare facilmente i valori (Mi piace / condivisioni) per uno specifico intervallo di tempo, ad esempio fb likes dopo 30 minuti o tweets dopo 24 ore per calcolare medie con cui confrontarsi (o le medie sono memorizzate nella propria tabella?)

Se questo approccio è difettoso o potrebbe migliorare, per favore fatemelo sapere, ma non è la mia domanda principale. La mia domanda principale è che cosa dovrebbe essere uno schema di database per la memorizzazione di queste informazioni?

Supponendo che l'approccio sopra sia preso, sto cercando di capire come sarebbe uno schema di database per la memorizzazione dei Mi piace nel tempo. Sono nuovo di zecca per i database, nel fare alcune letture di base vedo che è consigliabile creare un database 3NF. Ho trovato il seguente schema possibile.

Schema 1

DB Popular Posts

  Table: Post
    post_id ( primary key(pk) )
    url
    title 

  Table: Social Activity
    activity_id (pk)
    url (fk)
    type (i.e. facebook,twitter,g+)
    value
    timestamp

Questo è stato il mio istinto iniziale (basato sulla mia conoscenza db molto limitata). Per quanto ho capito questo schema sarebbe 3NF? Ho cercato disegni di modelli di database simili e ho trovato questa domanda su stackoverflow, link . Lo scenario in questa domanda è simile (registrazione peso / altezza degli utenti straordinari). Prendendo la risposta accettata per quella domanda e applicandola al mio modello si ottiene qualcosa del tipo:

Schema 2 (come sopra, ma analizza l'attività sociale in 2 tabelle)

DB Popular Posts

  Table: Post
    post_id (pk)
    url
    title 

  Table: Social Measurement
    measurement_id (pk)
    post_id (fk)
    timestamp

  Table: Social stat
    stat_id (pk)
    measurement_id (fk)
    type (i.e. facebook,twitter,g+)
    value

Il vantaggio che vedo nello schema 2 è che probabilmente vorrò accedere a tutti i valori per un dato tempo, cioè quando effettui una misurazione a 30 minuti dopo la pubblicazione di un post, verificherò simultaneamente il numero di fb likes, le condivisioni fb, commenti fb, tweet, g +, linkedIn. Quindi con questo schema può essere più facile ottenere tutte le statistiche per un measurement_id corrispondente ad una certa ora, cioè tutte le statistiche sociali per il post 1234 alla volta x.

Un altro pensiero è che non ha senso confrontare il numero di Mi piace con il numero di tweet o di condivisioni g +, forse ha senso separare ogni misura sociale nella propria tabella?

Schema 3

DB Popular Posts

  Table: Post
    post_id (pk)
    url
    title 

  Table: fb_likes
    fb_like_id (pk)
    post_id (fk)
    timestamp
    value

  Table: fb_shares
    fb_shares_id (pk)
    post_id (fk)
    timestamp
    value

  Table: tweets
    tweets__id (pk)
    post_id (fk)
    timestamp
    value

  Table: google_plus
    google_plus_id (pk)
    post_id (fk)
    timestamp
    value

Come puoi vedere, sono generalmente perso / incerto su quale approccio adottare.

Sono sicuro che questo tipico tipo di problema del database (memorizzazione delle misurazioni straordinarie, vale a dire la statistica della temperatura) che deve avere una soluzione comune. C'è un modello / modello di design per questo, ha un nome? Ho provato a cercare "raccolta periodica di dati del database" o "misurazioni di database nel tempo", ma non ho trovato nulla di specifico.

Quale sarebbe un modello appropriato per risolvere i bisogni di questo problema?

    
posta gage 26.10.2013 - 09:56
fonte

2 risposte

2

Quindi, leggendo questo, vedo le seguenti specifiche:

  1. Voglio tenere traccia della popolarità dei blog. Questo si ottiene confrontando i loro "Mi piace" o qualsiasi cosa (retweet, ecc.) Per un periodo di 48 ore al loro livello "normale".

  2. Voglio aggiornare il mio conteggio corrente di Mi piace, retweet, su un intervallo periodico configurabile.

  3. Devo essere in grado di calcolare l'effetto di Mi piace, retweet, ecc indipendenti l'uno dall'altro.

Sembra che il modo più semplice sarebbe utilizzare il terzo schema. Permette comunque di raccogliere tutte le statistiche contemporaneamente o indipendentemente. L'unico effetto sarebbe se indipendente, ci sarà sempre una finestra di tempo in cui le classifiche attuali non riflettono il vero ranking mentre, se simultaneamente, le tue classifiche sono solo in ritardo rispetto alla "verità" al massimo il tasso di aggiornamento.

In ogni caso, quindi, puoi periodicamente eseguire una query per ogni post_id, calcolare la metrica di fb likes nelle precedenti 48 ore + tweet nelle precedenti 48 ore, ecc. e utilizzarla per aggiornare il tuo ranking.

    
risposta data 27.01.2014 - 21:14
fonte
0

Per rispondere alle domande che vuoi fare alla tua domanda devi memorizzare informazioni su tre cose: blog, post e attività.

I blog sono semplicemente contenitori per i post, perché hai detto di voler posizionare / evidenziare i post all'interno di ciascuno dei blog, non attraverso i blog, quindi è necessario sapere quali post appartengono a quali blog. I post sono abbastanza statici, ma sono indipendenti dai rispettivi blog e dalla loro attività sociale. L'attività sociale è altamente dinamica (probabilmente si presenta come una curva a campana nel tempo) e potrebbe esserci o meno un limite per la scoperta dell'attività sociale nel tempo.

Ora, questo ti lascia con tre entità principali: blog, post e attività. Lo schema potrebbe essere simile a questo:

blog          post          activity
----------    -----------   --------
blog_id (pk)  post_id (pk)  activity_id (pk)
url           blog_id (fk)  post_id (fk)           
title         url           facebook_likes
              title         twitter_tweets
                            google_shares

Questo presuppone che non sei interessato a memorizzare l'effettiva attività sui social media, ad esempio l'archiviazione dell'URL del tweet, ecc., e solo la memorizzazione dei risultati della scoperta dell'attività social per ogni post. Se esegui questo per un nuovo post oggi, inserirai i risultati nella tabella delle attività. Se esegui nuovamente la scoperta domani, una riga nella tabella delle attività esiste già e la aggiorneresti con i risultati in quel momento.

(Avviso di creep delle caratteristiche: se si memorizzano nuove righe per ciascuna scoperta, si può ottenere una preziosa visione di come si sviluppa l'attività dei social media nel tempo, ad esempio si può vedere quale mezzo è veloce a prendere il post e quale lag E potresti creare alcuni grafici utili che renderebbero più interessante la presentazione: per fare ciò dovresti memorizzare esattamente le stesse cose, ma anche aggiungere una data / timestamp per quando è stata effettuata la scoperta.)

Una chiave esterna collega la riga a una riga in un'altra tabella. Ad esempio, un blog ha più post e un post appartiene a un singolo blog. Questa è una relazione uno a molti: un blog ha molti post, un post appartiene a uno e solo un blog. Un blog potrebbe avere il blog_id 1. Tutti i post che appartengono a quel blog avrebbero il loro blog_id impostato su 1.

Tecnicamente parlando potresti eliminare la tabella delle attività e spostare le colonne nella tabella dei post, se lo desideri. La ragione per cui le sto tenendo separate è che sono entità distinte e lascia la porta aperta per cambiamenti futuri. Ad esempio potresti facilmente aggiungere un timestamp e memorizzare l'attività come qualcosa che varia nel tempo. Inoltre, potresti scomporlo ancora di più e aggiungere un'altra tabella (ad esempio azione) che memorizza le azioni dei singoli social media (i tweet, i like, ecc.).

Come ottimizzazione è possibile calcolare e memorizzare le metriche sulle rispettive entità (ad esempio, tabella e posta) se necessario. Questo è principalmente un problema quando si tratta di leggere i dati dopo aver fatto la scoperta. Ricorda che calcolerai e aggiornerai il database molto poco rispetto a quante volte i tuoi utenti leggeranno le informazioni - in altre parole, denormalizzare e aggregare ridurrà il numero di query necessarie per produrre i dati che desideri presentare al tuo utenti.

    
risposta data 29.01.2014 - 12:17
fonte