Strutturazione del database per funzionalità "attività" e "seguenti" multioggetto

5

Sto lavorando su un'applicazione web che funziona con diversi tipi di oggetti come utente, profili, pagine ecc. Tutti gli oggetti hanno un object_id unico.

Quando gli oggetti interagiscono, può produrre "attività", come la pubblicazione dell'utente sulla pagina o sul profilo. L'attività può essere correlata a più oggetti tramite il loro object_id .

Gli utenti possono anche seguire "oggetti" e devono essere in grado di vedere il flusso di attività pertinenti.

Potresti fornirmi alcuni suggerimenti sulla struttura dei dati che sarebbero efficienti e scalabili? Il mio obiettivo è mostrare attività limitate agli oggetti che l'utente sta seguendo Non sono limitato dai database relazionali.

Aggiornamento

Dato che sto ricevendo consigli su ORM e su come indicizzare le cose, mi piacerebbe di nuovo, sottolinea la mia domanda. Secondo il mio attuale modello di progettazione, la struttura del database si presenta così:

Comepuoivedere-èabbastanzafacileimplementareundatabasecomequello.LetabelleActivityeFollowercontengonounaquantitàdirecordmoltomaggiorerispettoallivellosuperioremaètollerabile.

Maquandositrattadicreareunatabella"cronologia", diventa un incubo. Per ogni utente ho bisogno di fare riferimento a tutte le attività oggetto che segue. In termini di record, diventa facilmente fuori controllo.

Per favore suggeriscimi come modificare questa struttura per evitare la creazione di timeline e anche essere in grado di recuperare rapidamente attività per qualsiasi utente. Grazie.

    
posta romaninsh 17.04.2012 - 15:45
fonte

5 risposte

3

Hai scritto che non sei limitato ai database relazionali. Potresti prendere in considerazione l'utilizzo di un database grafico, come neo4j . I database grafici sono particolarmente adatti per situazioni come la tua in cui le relazioni sono più importanti, ad esempio, delle medie e delle somme.

Puoi trovare introduzione qui e < a href="https://github.com/thobe/social-network-workshop"> esempio di lavoro qui .

Una struttura più complessa, ma più efficiente che è possibile utilizzare è Graphity .

    
risposta data 18.06.2012 - 00:52
fonte
3

È difficile da dire senza sapere molto di più, ma sembra che tu voglia qualcosa di molto generico. Forse qualcosa del genere potrebbe aiutare:

activity
--------
  activity_id  - the ID of the activity
  participating_object_id - ID of a participating object
  activity_type_id - ID of the Type of activity
  activity_datetime - When this activity occurred
  data - context data of the activity

Questo ti permetterebbe di avere cose come:

activity_id | participating_object_id | activity_type_id | date  | data
------------+-------------------------+------------------+-------+-----
1           | 2                       | 3                | ...   | this is a post
1           | 84                      | 3                | ...   | [email protected]

Questo descrive un'istanza di attività (ID # 1): un utente (oggetto # 84, dati di contesto "[email protected]") ha creato un post su un forum (tipo di attività 3) il cui ID oggetto è 2 e il la pubblicazione conteneva il testo "questo è un post".

Probabilmente dovrai espanderlo come richiesto dalla tua situazione.

... in realtà, ora che ci penso, la colonna data non è probabilmente necessaria, dal momento che puoi ottenere tutti i dati che desideri dalla tua tabella di base object (qualunque sia l'aspetto) interrogandoli usando i valori in participating_object_id .

    
risposta data 17.04.2012 - 15:57
fonte
2

Una possibilità è usare "eredità", esp. se gli oggetti a cui fai riferimento hanno campi comuni. Lo schema ha questo aspetto:

followables
    followable_id      primary key
    -- common fields

users
    user_id            primary key references followables(followable_id)
    -- user specific fields

pages
    page_id            primary key references followables(followable_id)
    -- page specific fields

...

random_entities
    ...
    followed_id        references followables(followable_id)

Ciò significa che entrambi pages e users "sono" followables , hanno followables "attributi e possono essere referenziati allo stesso modo.

Gli ORM spesso creano schemi come questo per modellare l'ereditarietà e gestire l'unione per te.

Non preoccuparti dell'inefficienza finché non proverai che si tratta di un problema.

WRT. all'efficienza. Scrivi un semplice script SQL che inserisca le informazioni di test fino al numero di righe che ritieni necessarie. Scrivi le tue domande (ricorda, non vuoi interrogare la tua intera timeline, di solito LIMIT le tue query), controlla la loro velocità di esecuzione, con le cose che hai detto, immagino che la performance sarà soddisfacente. In caso contrario, pubblica le tue query e le uscite di EXPLAIN .

    
risposta data 17.04.2012 - 21:44
fonte
1

La denormalizzazione diventerà tua amica qui - hai preso in considerazione solo la creazione di una tabella timeline statica che puoi selezionare facilmente?

Vorrei anche prendere in seria considerazione gli archivi di dati non relazionali qui - tendono ad adattarsi bene a questo tipo di problema.

    
risposta data 18.06.2012 - 01:13
fonte
0

Perché non usare un ORM in grado di costruire lo schema per te attorno alle tue classi? In questo modo puoi allenare i dettagli a un livello più alto di astrazione, lasciare che l'ORM progetta lo schema e quindi rivedere ciò che ha fatto per modificarlo / modificarlo in base alle prestazioni.

    
risposta data 17.04.2012 - 19:39
fonte