Modifica della progettazione della tabella SQL in base ai ruoli dei dati o alla convenienza dell'implementazione?

1

Ho una struttura di tabella SQL esistente che assomiglia a questa:

Orders
- order_id
- organisation_id
- [all the rest of the order data]

Organisations
- organisation_id
- [all the rest of the organisation data]

Users
- user ID
- [all the rest of the user data]

Sto provando a modificare la tabella Orders in modo che un ordine possa essere collegato a Organisation o a User . Ho due idee:

Opzione A

  • Aggiungi campo orders.user_id , quindi imposta user_id o organisation_id su null per ogni ordine, indicando se l'ordine è stato inserito da un utente o un'organizzazione.

Opzione B

  • Aggiungi una tabella orderers (o simile) e aggiungi i campi organisations.orderer_id e users.orderer_id . Quindi, gli utenti e le organizzazioni sono entrambi ordinatori e gli ordini degli ordini sono ordinati.

Valutazione

L'approccio basato sui ruoli dell'opzione B sembra avere senso e sembra essere più estendibile, ma non posso fare a meno di pensare alla seccatura che la% diJOIN in più causerà, in termini di prestazioni e SQL complessità.

Qual è il modo migliore per farlo?

    
posta Fabian Tamp 03.06.2013 - 06:41
fonte

1 risposta

1

L'opzione B ti causerà un lavoro extra sulla costruzione dei join, ma non necessariamente le peggiori prestazioni, a seconda della tua situazione.
Considera questo scenario:
- 1k organizzazioni
- 20k utenti
- 1M ordini
Con lo scenario A dovrai prendere in considerazione:
- avrai una colonna in più su una tabella di righe 1M
- probabilmente vorrai un indice per user_id e uno per organisation_id, quindi se vuoi trovare tutti gli ordini che appartengono a ciascuno puoi trovarli più velocemente. Ciò significa che i tuoi inserimenti / eliminazioni saranno più lenti rispetto allo scenario B, che richiede solo, in riferimento alla tua tabella più grande:
- solo un indice su orderer_id.
Penso che la scelta migliore finirà a seconda della tua situazione specifica, ma tieni questo in considerazione.

    
risposta data 03.06.2013 - 15:20
fonte

Leggi altre domande sui tag