2016-01-01 16 views
5

Qual è l'approccio migliore per l'aggiornamento di una colonna regolare non indicizzata (non una chiave primaria correlata) in tutte le tabelle che la contengono come duplicata?Come gestire una modifica dei dati denormalizzati

i.e l'utente pubblica qualcosa e quel post è duplicato in molte tabelle per il recupero veloce. Ma quando quel post cambia (con una modifica) deve essere aggiornato in tutto il database, in tutte le tabelle che contengono quel post (in tabelle che hanno chiavi primarie diverse e sconosciute).

Solutions sto pensando di:

  1. avere una tabella mapper per rintracciare le chiavi primarie in tutti quei tavoli, ma sembra condurre a tabelle di esplosione (post non è l'unica proprietà che potrebbe cambiare).
  2. Utilizzare Solr per eseguire la mappatura, ma temo che lo utilizzerei per lo scopo errato.

Qualsiasi illuminazione sarebbe apprezzata.

MODIFICA (schema fittizio).

Cosa succede se il post cambia? o anche il display_name dell'utente?

CREATE TABLE users (
    id uuid, 

    display_name text, 

    PRIMARY KEY ((id)) 
); 

CREATE TABLE posts (
    id uuid, 

    post text, 
    poster_id uuid, 
    poster_display_name text 
    tags set<text>, 
    statistics map<int, bigint>, 

    PRIMARY KEY ((id)) 
); 

CREATE TABLE posts_by_user (
    user_id uuid, 
    created timeuuid, 

    post text, 
    post_id uuid, 
    tags set<text>, 
    statistics map<int, bigint>, 

    PRIMARY KEY ((id), created) 
); 
+0

Se è possibile aggiungere uno schema di tabella che sarebbe utile. –

+0

Aggiunto uno schema fittizio .. – Droritos

+0

Dovremmo cambiare il titolo in "dati denormalizzati" invece di "dati duplicati"? –

risposta

1

Dipende dalla frequenza degli aggiornamenti. Ad esempio, se gli utenti aggiornano solo raramente i loro nomi (una manciata di tempo per account utente), potrebbe essere ok utilizzare un indice secondario. Sappi solo che l'uso di un 2i è un raggruppamento di dispersioni, quindi vedrai problemi di prestazioni se si tratta di un'operazione comune. In questi casi, ti consigliamo di utilizzare una vista materializzata (o quella in 3.0 o gestirla tu stesso) per poter ottenere l'elenco di tutti i post per un determinato utente, quindi aggiornare il nome visualizzato dell'utente.

Io consiglio di farlo in un lavoro in background e di dare all'utente un messaggio del tipo "potrebbe volerci [qualche unità di tempo] perché il cambiamento del tuo nome si rifletta ovunque".

Problemi correlati