Usa i dati ridondanti nella progettazione del database quando hai più relazioni

0

Nella mia applicazione web gli utenti possono inviare le proprie pubblicità e acquistare pacchetti per fare pubblicità (i pacchetti vengono usati per la priorità di mostrare pubblicità)

Lo schema del database è come questo:

** Pacchetto: id, titolo, priorità (numero intero)

** PackageDuration: id, package_id (fk), durata, titolo

** Pubblicizza: id, titolo, contenuto, ...

** Ordine: prezzo, user_id, ...

** AdvertisePackage: advertise_id (fk), packageDuration_id (fk), order_id, startDate

per mostrare gli elenchi pubblicitari witch è la query più utilizzata nell'applicazione, dovrei unirmi a queste tabelle:

Pubblicità = > AdvertisePackage = > PackageDuration = > Package

La mia domanda è per le prestazioni e la facilità della query Voglio aggiungere campi Nella tabella degli annunci: (priority-startDate-endDate)

Bad design è così?

    
posta mohsenJsh 30.06.2016 - 20:05
fonte

1 risposta

2

È una cattiva pratica denormalizzare come affermi. A seconda dei criteri di ricerca, una qualsiasi delle quattro tabelle potrebbe essere scelta dalla routine di ottimizzazione della query. Se selezioni un package selezionato da un elenco a discesa, non ci dovrebbero essere motivi per aggiungere la tabella packages alla query poiché è possibile far corrispondere il package_id nella tabella package_durations .

Potrebbero esserci motivi per migrare colonne da una tabella a un'altra. Se la durata del pacchetto (start_date, end_date) può essere modificata dopo l'esecuzione degli ordini, potresti voler copiare la durata dell'ordine. Se il priority di un pacchetto può cambiare, copialo nella tabella orders , altrimenti lasciatelo in Tuttavia, migrare le colonne per semplificare la query può portare a problemi.

Sebbene molti strumenti di modellazione assumano come valore predefinito id come nome della chiave surrogata, trovo più utile usare un prefisso basato sul nome della tabella. Ad esempio, usa order_id per la tabella orders ( order è una parola chiave e dovrebbe essere evitata). Avere una tabella order implica che hai un solo ordine, mentre orders implica più di un ordine. È utile se i nomi delle tabelle e delle colonne possono essere utilizzati in frasi che indicano chiaramente le tue intenzioni.

    
risposta data 01.07.2016 - 02:16
fonte

Leggi altre domande sui tag