Design ottimale del database per quanto riguarda la funzionalità di consentire agli utenti di condividere i post di altri utenti

0

Voglio implementare funzionalità che consentano agli utenti di condividere i post di altri utenti in modo simile a ciò che Facebook e Google+ condividono con il pulsante e twitter retweet.

Ci sono 2 scelte:

1) Creo una copia duplicata del post e ho una colonna che tiene traccia dell'id post originale e chiarisce che si tratta di un post condiviso.

2) Ho un post condiviso della tabella separata in cui salvataggio l'id del post che è una chiave esterna per postare id nella tabella dei post.

Parlando in termini di programmazione in pratica tengo puntatore al post originale in una tabella separata e quando è necessario pubblicare post pubblicato dall'utente e anche condivisi faccio un join sinistro su post e tabella post condivisa

    Post(post_id(PK), post_content, posted_by)

    SharedPost(post_id(FK to Post.post_id), sharing_user, sharedfrom(in case someone shares from non owners profile))

Sono favorevole alla seconda scelta ma volevo sapere il parere degli esperti là fuori?

Una cosa in più dei post sulla mia webapp sarà più sulle linee della dimensione di facebook che non sulla dimensione del tweet.

    
posta codecool 26.03.2012 - 14:51
fonte

3 risposte

5

È il classico "link vs copy".

Raccomando di fare una copia duplicata. Sebbene "duplicato" potrebbe non essere il termine corretto poiché si condivide un istantaneo di tempo. È "unico" rispetto a quel contesto.

Ad esempio, se si dispone di una tabella della cronologia, si desidera archiviare copie dei dati, non chiavi esterne. Con una storia non ti interessa gli ultimi valori. Vuoi i valori di quel momento nel tempo. Sarebbe scorretto usare un FK.

Se un poster cancella il loro post, allora il tuo link condiviso è rotto. Meno 1 ai collegamenti.

Che cosa succede se il poster modifica il loro post con qualcosa di offensivo dopo averlo condiviso? Ciò renderebbe l'utente di condivisione un aspetto negativo. Meno 1 ai collegamenti.

Prestazioni. La copia è dispendiosa sullo spazio del disco. Tuttavia, elimina la necessità di mantenere un indice su una chiave esterna. Potrebbe non sembrare molto, ma su un database estremamente grande è un grosso problema. Con qualsiasi set di dati calibro di face book dovrai rompere con la tradizione un po 'per rendere le cose veloci. Meno 1 ai collegamenti.

Che cosa significa questo per la condivisione dei post? Dipende da cosa vuoi. Stai progettando di condividere un "link" o una "copia"? Ci sono vantaggi e svantaggi per entrambi i modelli. Lascerò che gli altri parlino dei vantaggi dei link.

EDIT: Si prega di non lasciare che il mio post ti scoraggi dai link. Per gli obiettivi della tua applicazione, potrebbero essere ciò di cui hai bisogno. Il Web ha ottenuto collegamenti abbastanza buoni finora.

    
risposta data 26.03.2012 - 21:31
fonte
2

Il tuo intuito è corretto, usa decisamente l'opzione 2. Non c'è motivo di duplicare l'intero post nel database ogni volta che qualcuno lo condivide. Basta avere una tabella SharedPosts separata che associa semplicemente gli ID utente ai post degli altri utenti, come dici tu.

Modifica

La risposta sopra presuppone che un post non possa essere modificato dopo che l'utente originale l'ha condiviso. Se può essere modificato dall'OP, gli utenti che lo hanno condiviso potrebbero non voler condividere la versione aggiornata, quindi puoi:

  1. cancella tutte le condivisioni di un post se il post originale viene aggiornato, OPPURE
  2. memorizza ogni post condiviso come duplicato dell'originale, come menzionato nella tua opzione 1

La risposta di Mike fa un ottimo lavoro per spiegare i vantaggi dell'archiviazione dei duplicati.

    
risposta data 26.03.2012 - 15:16
fonte
0

Vorrei solo duplicare la pubblicazione originale. Questo semplifica il tuo livello di dominio quando si occupano di delezioni, duplicazioni (da un'altra duplicazione) ed ecc.

Se duplica la pubblicazione, contrassegnandola come duplicata (contrassegno semplice), ottieni l'eliminazione, la condivisione, ecc. gratuitamente, invece di creare una logica complicata dietro alle duplicazioni.

    
risposta data 26.03.2012 - 21:17
fonte

Leggi altre domande sui tag