должна ли нормализоваться эта таблица базы данных? - PullRequest
4 голосов
/ 11 апреля 2010

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

Сегодня существует одна таблица с именем: тренировки , которая имеет следующие поля

id, упражнение_id, повторений, вес, дата, person_id

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

идентификатор, идентификатор упражнения, количество повторений, вес, дата, идентификатор человека
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, 01.01.2010, 10
6, 2, 10, 100, 01.01.2010, 10

Таким образом, вопрос в том, что в нескольких записях есть несколько избыточных данных (date, personid, exerc_id), если их нормализовать до трех таблиц

WorkoutSummary
- id
- дата
- person_id

WorkoutExercise
- id
- workout_id (внешний ключ в WorkoutSummary)
- упражнение_ид

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

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

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

Ответы [ 2 ]

8 голосов
/ 11 апреля 2010

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

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

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

2 голосов
/ 11 апреля 2010

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

Итак ДА , это похоже на совершенно нормальный рефакторинг.

...