Domanda

ho preso nel corso di un database che memorizza le informazioni di fitness e ci hanno visto un dibattito su un certo tavolo e se debba rimanere come un tavolo o ottenere suddiviso in tre tabelle.

Oggi, v'è una tabella denominata: allenamenti che ha i seguenti campi

id, exercise_id, ripetizioni, il peso, la data, person_id

Quindi, se ho fatto 2 set di 3 diversi esercizi in un giorno, avrei 6 record in tale tabella per quel giorno. per esempio:

id, exercise_id, ripetizioni, il peso, la data, person_id
1, 1, 10, 100, 1/1/2010, 10
2, 1, 10, 100, 1/1/2010, 10
3, 1, 10, 100, 1/1/2010, 10
4, 2, 10, 100, 1/1/2010, 10
5, 2, 10, 100, 1/1/2010, 10
6, 2, 10, 100, 1.1.2010, 10

Quindi la domanda è, dato che ci sono alcuni dati ridondanti (data, personId, exercise_id) in più record, questo dovrebbe essere normalizzato a tre tabelle

WorkoutSummary :
 - id
 - data di
 - person_id

WorkoutExercise :
 - id
 - workout_id (chiave esterna in WorkoutSummary)
 - exercise_id

WorkoutSets :
 - id
 - workout_exercise_id (chiave esterna in WorkoutExercise)
 - ripetizioni
 - di peso

Vorrei indovinare il lato negativo è che le query sarebbe più lento dopo questo refactoring come ora avremmo bisogno di unire 3 tavoli di fare la stessa query che non avevano unisce prima. Il beneficio del refactoring permette in futuro di aggiungere nuovi campi a livello di riepilogo allenamento o il livello di esercizio con l'aggiunta di fuori in più di duplicazione.

tutte le risposte a questo dibattito?

È stato utile?

Soluzione

Non date per scontato che le query saranno più lento dopo la normalizzazione. Si unisce su un piccolo numero di tavoli sono molto economici se le tabelle sono indicizzati correttamente.

D'altra parte, le query su una tabella non normalizzata può facilmente finire per essere molto più lento. Ad esempio, nello schema originale, semplicemente cercando di interrogare le date distinte su cui è stato fatto un allenamento è molto più costoso di quello che sarebbe stato con la versione normalizzata.

Sicuramente normalizzare a questo punto. Se si esegue in problemi di prestazioni in seguito, allora si può iniziare in modo selettivo denormalizing alcune parti dei dati di oltre per lo schema già normalizzata. Ma con ogni probabilità non si sarà mai raggiungere quel punto con un piccolo database.

Altri suggerimenti

Il nuovo refactoring sembra buono, e le prestazioni non sarà tutto ciò che colpiti se si hanno gli indici appropriati sui vari tavoli. (Gli indici possono essere creati su tutte le chiavi esterne)

YES , che sembra un refactoring perfettamente normale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top