Utilizzo degli schemi per il confinamento dei dati per ciascun cliente (o il filtro rispetto a una tabella clienti)?

0

Sto pianificando un database che conterrà dati per molti progetti / clienti.

I dati per ciascun cliente saranno totalmente indipendenti. Tuttavia avranno tutti la stessa struttura.

Quindi mi chiedo, potrebbe essere utile fare uno schema per ogni cliente (e duplicare le tabelle in esso)?

Per riprendere, rifletto tra le due opzioni:

  1. utilizzando i join: ogni tabella ha un collegamento alla tabella clienti e, quando eseguono le query, controlliamo che Table.customer_id == current_customer_id
  2. con schemi: creiamo uno schema per ogni cliente. Su connessione, selezioniamo lo schema. Quindi non dobbiamo preoccuparci di filtrare

La soluzione 1 è più classica. Ma in ogni API, e all'incirca ogni volta che accediamo ai dati, dobbiamo fare un join alla tabella dei clienti.

Poiché utilizziamo SQLAlchemy, non possiamo semplicemente chiamare

Table.query.get(id)

ovunque dobbiamo trasformarlo in

Table.query.filter(Table.id == id).filter(Table.customerId == customerId).first()

L'uso degli schemi renderebbe il codice più semplice ed elegante. Nessun rischio di inviare dati al cliente sbagliato. Tuttavia sembra essere un abuso del concetto di "schema", in quanto ognuno conterrebbe le stesse tabelle. Renderebbe il database più complesso e più difficile da mantenere (le evoluzioni delle tabelle dovrebbero essere eseguite in ogni schema)

Hai qualche idea sulla domanda? Ci sarebbe un'alternativa, permettendoci di selezionare un sottogruppo di dati all'inizio di ogni transazione?

Grazie in anticipo!

    
posta Eino Gourdin 07.07.2017 - 09:54
fonte

1 risposta

1

Se capisco correttamente che hai clienti ogni cliente, ad esempio, può avere posizioni diverse (uffici) e fatture. Possono avere anche altre tabelle ma, per ragioni di discussione, lo sto mantenendo semplice. Nell'esempio 1 stai suggerendo 3 tabelle: clienti, posizioni e fatture. Nel suggerimento 2 si propone il numero di clienti volte 2 (CustomerA_Locations, CustomerA_Invoices, CustomerB_Locations, CustomerB_Invoices, ecc.)

Raccomando l'opzione 1 perché se lo schema dovesse mai cambiare in qualche modo, allora dovresti replicare quella modifica in più punti. Anche il concetto di tenere insieme i dati è stato sconfitto nella versione 2. Le informazioni sui clienti verrebbero replicate più di una posizione con la versione 2 che richiederebbe la sincronizzazione di qualsiasi modifica.

Se sei preoccupato di dover partecipare costantemente, ti consiglio di utilizzare le visualizzazioni per "partecipare a una sola volta". Le viste non sono supportate immediatamente da SQLAlchemy ma possono essere aggiunte per: link .

Se hai domande, sarei felice di espanderti.

    
risposta data 07.07.2017 - 16:00
fonte

Leggi altre domande sui tag