Database
 sql >> Database >  >> RDS >> Database

Progettazione di database 101

Un buon esercizio di modellazione dei dati per i principianti consiste nel creare un modello di dati di un negozio online . Ogni volta che do questo esercizio ai miei studenti, sono sorpresa di quanto sia difficile per loro.

Trova i concetti...

Vediamo come si può fare. Sappiamo che dobbiamo creare una tabella per ogni concetto nel dominio. Pensa ai nomifrasi nominali useresti per descrivere il dominio. Approssimativamente, ogni sostantivo è un concetto, un attributo di un concetto o un esempio . Quali sono i concetti di base in un negozio online? Mi vengono subito in mente due parole:

  • clienti – persone che acquistano cose nel nostro negozio e
  • prodotti – articoli che le persone acquistano nel nostro negozio.

Ogni cliente ha una serie di dati di base che lo descrivono:id (di solito è necessario un attributo id nella tabella), nome, e-mail e password. Allo stesso modo, un prodotto ha un ID e un nome. Potremmo aggiungere più attributi per clienti e prodotti, ma per il bene di questo esempio, questi andranno bene. Aggiungiamo le due tabelle nel nostro modello.

... Così come i concetti astratti

Questo è un negozio, quindi ovviamente vogliamo sapere cosa è stato ordinato e da chi . "Ordine" è una parola chiave nella maggior parte dei database, quindi non dovremmo usarla per il nome di una tabella. Useremo invece il nome purchase per la terza tavola del nostro modello. La tabella deve essere in qualche modo collegata al customer e al product . Per cominciare, tracciamo un riferimento tra purchase e customer e tra purchase e product .

Il customer-purchase il riferimento è OK. Ogni acquisto viene effettuato da un cliente; ogni cliente può effettuare più acquisti. Questo riferimento è qui per restare.

Tuttavia, c'è qualcosa che non va nel purchase-product riferimento. È possibile acquistare più prodotti in un unico acquisto; più acquisti possono includere lo stesso prodotto. Ma il nostro riferimento consente di acquistare un solo prodotto in un unico acquisto. Eliminiamo il riferimento e pensiamo a un modo diverso di modellarlo.

Un grande campo di testo per tutti i prodotti acquistati?

Che ne dici di aggiungere un grande campo di testo che può memorizzare i nomi o gli ID dei prodotti acquistati? Ora possiamo acquistare più prodotti in un unico acquisto. Tuttavia, ci sono alcuni problemi qui:

  • In primo luogo, è difficile verificare che il prodotto in purchased_items campo è realmente nel database.
  • Secondo, se vuoi cambiare il nome del prodotto (perché hai sbagliato a scrivere) devi aggiornare tutti gli purchased_items istanze del campo nell'purchase tabella.
  • Infine, è difficile analizzare i dati nel database. Ad esempio, se si desidera scoprire quale prodotto viene acquistato più spesso, è necessario utilizzare un'operazione di sottostringa di testo. E non è mai molto efficiente.

Diverse colonne di prodotti nella tabella degli acquisti?

Quali sono alcune altre opzioni? Vogliamo che un acquisto sia collegato a diversi prodotti, quindi forse dovremmo aggiungere diversi purchase_item colonne in una tabella di acquisto? Bene, è noioso (ho aggiunto solo 5 colonne e mi sono stancato) e crea un aspetto artificiale e stupido limite al numero di prodotti acquistati.

Usa una tavola intermedia!

La soluzione sciocca suggerisce la soluzione giusta. Vogliamo avere un illimitato numero di prodotti connessi all'acquisto. L'unico modo è avere una tabella di collegamento intermedia . Chiamiamolo purchase_item . Il purchase_item la tabella è collegata a purchase e product . Ora un acquisto può includere tutti i prodotti che vogliamo. Come bonus possiamo aggiungere ulteriori dati nella tabella:numero di volte acquistati, prezzo totale per questo articolo e così via.


Conclusioni:

  • Le tabelle nel modello possono rappresentare non solo oggetti fisici come cliente o prodotto. Le tabelle possono rappresentare più concetti astratti come un acquisto. Altri esempi potrebbero essere una prenotazione in un sistema di prenotazione alberghiera, un book_loan in un modello per la biblioteca, un appuntamento in un sistema per medici, ecc.
  • Quando modelli una transazione (ad esempio, l'acquisto o la vendita di molte cose), di solito hai bisogno di tre tabelle :uno per la transazione (acquisto o prenotazione in un sistema di prenotazione alberghiera), uno per gli oggetti acquistati/venduti in una transazione (prodotto, camera d'albergo) e uno per gli elementi della transazione (oggetto_acquisto, elemento_prenotazione). Se necessario, puoi aggiungere ulteriori informazioni nella tabella intermedia.

Crea il tuo modello di database del negozio con Vertabelo!