Progettazione dello schema di social network in DynamoDB - Amazon DynamoDB

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Progettazione dello schema di social network in DynamoDB

Caso d'uso aziendale di social network

In questo caso d'uso viene descritto l'utilizzo di DynamoDB come un social network. Un social network è un servizio online che consente a diversi utenti di interagire tra loro. Il social network che verrà progettato consentirà all'utente di visualizzare una sequenza temporale composta da post, follower, utenti seguiti e post scritti dagli utenti seguiti. I modelli di accesso per questo schema sono:

  • Ottenere informazioni utente per un userID specifico

  • Ottenere l'elenco di follower per un userID specifico

  • Ottenere l'elenco di follower per un userID specifico

  • Ottenere l'elenco di post per un userID specifico

  • Ottenere l'elenco di utenti a cui piace il post per un postID specifico

  • Ottenere il numero di like per un postID specifico

  • Ottenere la sequenza temporale per un userID specifico

Diagramma delle relazioni tra entità del social network

Questo è il diagramma delle relazioni tra entità (ERD) che useremo per la progettazione dello schema dei social network.

ERDper un'applicazione di social network che mostra entità come User, Post e Follower.

Modelli di accesso di social network

Questi sono i modelli di accesso che creeremo per la progettazione dello schema di social network.

  • getUserInfoByUserID

  • getFollowerListByUserID

  • getFollowingListByUserID

  • getPostListByUserID

  • getUserLikesByPostID

  • getLikeCountByPostID

  • getTimelineByUserID

Evoluzione della progettazione dello schema di social network

DynamoDB è un database SQL No, quindi non consente di eseguire un join, un'operazione che combina i dati di più database. I clienti che non conoscono DynamoDB potrebbero applicare le filosofie di progettazione del sistema di gestione di database relazionali RDBMS () (come la creazione di una tabella per ogni entità) a DynamoDB quando non ne hanno bisogno. Lo scopo della progettazione tabella singola di DynamoDB è scrivere dati in un formato pre-unito in base al modello di accesso dell'applicazione e quindi utilizzare immediatamente i dati senza calcoli aggiuntivi. Per ulteriori informazioni, consulta Progettazione tabella singola e progettazione tabelle multiple in DynamoDB.

Ora illustreremo come intendiamo sviluppare la progettazione dello schema per gestire tutti i modelli di accesso.

Fase 1: Gestire il modello di accesso 1 (getUserInfoByUserID)

Per ottenere le informazioni di un determinato utente, devi eseguire una Query della tabella di base con una condizione chiave di PK=<userID>. L'operazione di interrogazione consente di impaginare i risultati, il che può essere utile quando un utente ha molti follower. Per ulteriori informazioni su Query, consulta Interrogazione di tabelle in DynamoDB.

In questo esempio, vengono monitorati due tipi di dati per gli utenti: il "conteggio" e le "informazioni". Il "conteggio" di un utente indica quanti follower ha, quanti utenti sta seguendo e quanti post ha creato. Le "informazioni" di un utente indicano le informazioni personali, come il nome.

Questi due tipi di dati sono rappresentati dai due elementi sottostanti. L'elemento che contiene "conteggio" nella sua chiave di ordinamento (SK) è più probabile che cambi rispetto all'elemento con "informazioni". DynamoDB considera le dimensioni elemento così come appaiono prima e dopo l'aggiornamento e la velocità di trasmissione effettiva assegnata consumata rifletterà il più grande di questi valori. Anche se aggiorni solo un sottoinsieme di attributi dell'elemento, UpdateItem utilizza comunque la quantità completa della velocità di trasmissione effettiva assegnata (il valore maggiore tra le dimensioni "prima" e "dopo"). Puoi ottenere gli elementi tramite una singola operazione Query e utilizzare UpdateItem per aggiungere o sottrarre attributi numerici esistenti.

Risultato dell'operazione Query per un utente con ID u #12345 e i relativi dati di conteggio e informazioni.

Fase 2: Gestire il modello di accesso 2 (getFollowerListByUserID)

Per ottenere un elenco di utenti che seguono un determinato utente, occorre eseguire una Query della tabella di base con una condizione chiave di PK=<userID>#follower.

Risultato dell'operazione Query su una tabella per elencare i follower dell'utente con ID u #12345.

Fase 3: Gestire il modello di accesso 3 (getFollowingListByUserID)

Per ottenere un elenco di utenti seguiti da un determinato utente, occorre eseguire una Query della tabella di base con una condizione chiave di PK=<userID>#following. È quindi possibile utilizzare un'TransactWriteItemsoperazione per raggruppare più richieste ed effettuare le seguenti operazioni:

  • Aggiungi l'utente A all'elenco dei follower dell'utente B, quindi incrementa di uno il numero di follower dell'utente B.

  • Aggiungi l'utente B all'elenco dei follower dell'utente A, quindi incrementa il numero di follower dell'utente A di uno.

Risultato dell'operazione di interrogazione su una tabella per elencare tutti gli utenti che segue l'utente con ID u #12345.

Fase 4: Gestire il modello di accesso 4 (getPostListByUserID)

Per ottenere un elenco di post creati da un determinato utente, devi eseguire una Query della tabella di base con una condizione chiave di PK=<userID>#post. Una cosa importante da notare qui è che quello di un utente postIDs deve essere incrementale: il secondo valore postID deve essere maggiore del primo valore postID (poiché gli utenti vogliono vedere i propri post in modo ordinato). Puoi farlo generando in postIDs base a un valore temporale come un identificatore ordinabile lessicograficamente universale (). ULID

Risultato dell'operazione Query con una condizione chiave per ottenere un elenco di post creati da un utente specifico.

Fase 5: Gestire il modello di accesso 5 (getUserLikesByPostID)

Per ottenere un elenco di utenti che hanno messo like al post di un determinato utente, devi eseguire una Query della tabella di base con una condizione chiave di PK=<postID>#likelist. Questo approccio è lo stesso modello utilizzato per recuperare gli elenchi di follower e di utenti seguiti nel modello di accesso 2 (getFollowerListByUserID) e nel modello di accesso 3 (). getFollowingListByUserID

Risultato dell'operazione Query con una condizione chiave per ottenere un elenco di utenti a cui è piaciuto il post di un utente specifico.

Fase 6: Gestire il modello di accesso 6 (getLikeCountByPostID)

Per ottenere un conteggio di like per un determinato post, occorre eseguire un'operazione GetItem sulla tabella di base con una condizione chiave di PK=<postID>#likecount. Questo modello di accesso può causare problemi di limitazione ogni volta che un utente con molti follower (ad esempio una celebrità) crea un post, poiché la limitazione si verifica quando il throughput di una partizione supera i 1000 al secondo. WCU Questo problema non è una conseguenza di DynamoDB, ma appare solo in DynamoDB poiché si trova alla fine dello stack software.

Occorre valutare se è davvero essenziale che tutti gli utenti visualizzino il conteggio dei like contemporaneamente o se questo può avvenire gradualmente nel tempo. In generale, il conteggio dei like di un post non deve essere immediatamente accurato al 100%. È possibile implementare questa strategia inserendo una coda tra l'applicazione e DynamoDB in modo che gli aggiornamenti avvengano periodicamente.

Risultato dell' GetItem operazione con una condizione chiave per ottenere il conteggio dei Mi piace per un post specifico.

Fase 7: Gestire il modello di accesso 7 (getTimelineByUserID)

Per ottenere la sequenza temporale per un determinato post, occorre eseguire un'operazione Query sulla tabella di base con una condizione chiave di PK=<userID>#timeline. Consideriamo uno scenario in cui i follower di un utente devono visualizzare i loro post in modo sincrono. Ogni volta che un utente scrive un post, il relativo elenco di follower viene letto e i valori userID e postID vengono inseriti lentamente nella chiave della sequenza temporale di tutti i suoi follower. Quindi, all'avvio dell'applicazione, puoi leggere la chiave della sequenza temporale con l'operazione Query e riempire la schermata della sequenza temporale con una combinazione di userID e postID utilizzando l'operazione BatchGetItem per tutti i nuovi elementi. Non è possibile leggere la timeline con una API chiamata, ma questa è una soluzione più economica se i post possono essere modificati frequentemente.

Poiché la sequenza temporale visualizza i post recenti, occorre un modo per cancellare quelli vecchi. Invece di utilizzarli WCU per eliminarli, puoi utilizzare la TTLfunzionalità di DynamoDB per farlo gratuitamente.

Risultato dell'operazione Query con una condizione chiave per ottenere la sequenza temporale di un determinato utente che mostra i post recenti.

Tutti i modelli di accesso e il modo in cui la progettazione dello schema li affronta sono riassunti nella tabella seguente:

Modello di accesso Tabella GSI base//LSI Operazione Valore della chiave di partizione Valore della chiave di ordinamento Altre condizioni/filtri
getUserInfoByUserID Tabella di base Query PK=<userID>
getFollowerListByUserID Tabella di base Query PK=<userID>#follower
getFollowingListByUserID Tabella di base Query PK=<userID>#following
getPostListByUserID Tabella di base Query PK=<userID>#post
getUserLikesByPostID Tabella di base Query PK=<postID>#likelist
getLikeCountByPostID Tabella di base GetItem PK=<postID>#likecount
getTimelineByID utente Tabella di base Query PK=<userID>#timeline

Schema finale del social network

Di seguito è riportata la progettazione dello schema finale. Per scaricare questo schema come JSON file, consulta Esempi di DynamoDB su. GitHub

Tabella di base:

Progettazione dello schema finale di una tabella che contiene i risultati della Query e delle operazioni precedenti. GetItem

Utilizzo di No SQL Workbench con questo schema di progettazione

Puoi importare questo schema finale in No SQL Workbench, uno strumento visivo che fornisce funzionalità di modellazione, visualizzazione dei dati e sviluppo di query per DynamoDB, per esplorare e modificare ulteriormente il tuo nuovo progetto. Per iniziare, segui queste fasi:

  1. Scarica No Workbench. SQL Per ulteriori informazioni, consulta Scarica No SQL Workbench per DynamoDB.

  2. Scarica il file di JSON schema sopra elencato, che è già nel formato del modello No SQL Workbench.

  3. Importa il file JSON dello schema in No SQL Workbench. Per ulteriori informazioni, consulta Importazione di un modello di dati esistente.

  4. Dopo averlo importato in NOSQL Workbench, puoi modificare il modello di dati. Per ulteriori informazioni, consulta Modifica di un modello di dati esistente.

  5. Per visualizzare il modello di dati, aggiungere dati di esempio o importare dati di esempio da un CSV file, utilizza la funzionalità Data Visualizer di No Workbench. SQL