должна ли эта таблица базы данных быть нормализована?

Я взял базу данных, в которой хранится информация о фитнесе, и у нас были дебаты об определенной таблице и о том, должна ли она оставаться одной таблицей или быть разбита на три таблицы.

На сегодняшний день существует одна таблица под названием тренировки со следующими полями.

id, training_id, повторения, вес, дата, person_id

Итак, если бы я сделал 2 подхода по 3 разных упражнения в один день, у меня было бы 6 записей в этой таблице для этого дня. Например:

id, Exercise_id, повторения, вес, дата, person_id
1, 1, 10, 100, 01.01.2010, 10
2, 1, 10, 100, 01.01.2010, 10
3, 1, 10, 100, 01.01.2010, 10
4, 2, 10, 100, 01.01.2010, 10
5, 2, 10, 100, 1/1 /2010, 10
6, 2, 10, 100, 01.01.2010, 10

Итак, вопрос в том, что, учитывая, что в нескольких записях есть некоторые избыточные данные (дата, идентификатор лица, упражнение_ид), следует ли их нормализовать до трех таблиц.

Сводка по тренировкам:
- идентификатор
- дата
- идентификатор_человека

WorkoutExercise:
 – id
 –workout_id (внешний ключ в WorkoutSummary)
 – Exercise_id

WorkoutSets:
 – id
 –workout_exercise_id (внешний ключ в WorkoutExercise)
 – повторения
 – вес

Я предполагаю, что недостатком является то, что запросы будут медленнее после этого рефакторинга, так как теперь нам нужно будет объединить 3 таблицы, чтобы выполнить тот же запрос, в котором раньше не было соединений. Преимущество рефакторинга позволяет в будущем добавлять новые поля на уровне сводки тренировки или на уровне упражнений без дополнительного дублирования.

какие-либо отзывы об этой дискуссии?


person leora    schedule 11.04.2010    source источник
comment
Какую базу данных используете?   -  person Stephanie Page    schedule 04.05.2010


Ответы (2)


Не думайте, что после нормализации запросы станут медленнее. Соединения с небольшим количеством таблиц очень дешевы, если таблицы правильно проиндексированы.

С другой стороны, запросы к ненормализованной таблице могут легко оказаться намного медленнее. Например, в вашей исходной схеме просто запросить разные даты, когда выполнялась тренировка, намного дороже, чем в нормализованной версии.

Определенно нормализуйте его на данный момент. Если позже у вас возникнут проблемы с производительностью, вы можете начать выборочную денормализацию определенных частей данных в дополнение к уже нормализованной схеме. Но, по всей вероятности, вы никогда не достигнете этого с небольшой базой данных.

person Aaronaught    schedule 11.04.2010
comment
@Aaronaught - вы говорите, правильно ли проиндексированы таблицы. какие поля вы рекомендуете индексировать здесь? - person leora; 11.04.2010
comment
@oo: почти всегда следует индексировать поле внешнего ключа (workout_id в WorkoutExercise и workout_exercise_id в WorkoutSets). В зависимости от ядра базы данных вы, вероятно, захотите сделать некоторые или все из этих индексов. Я не уверен, что это за поле exercise_id, предположительно, это тип выполняемого упражнения? Если да, то если вы планируете получать запросы, основанные на типе упражнений (Джон не отстает от приседаний?), то вам, вероятно, также понадобится индекс для этого. - person Aaronaught; 11.04.2010
comment
Добавьте индекс ко всему, что появится в предложении WHERE, ко всем первичным, потенциальным и внешним ключам. - person duffymo; 11.04.2010

Новый рефакторинг кажется хорошим, и если у вас есть соответствующие индексы для различных таблиц, это не повлияет на производительность. (Индексы могут быть созданы для всех внешних ключей)

Так что ДА, это кажется совершенно нормальным рефакторингом.

person Adriaan Stander    schedule 11.04.2010