Несколько логических полей или одно текстовое поле в базе данных?
Я просто копаюсь в базах данных и при создании базы данных я понял, что есть случаи, когда то, что может быть текстовым полем, может также быть несколькими булевыми полями.
Чтобы привести конкретный пример: я создаю базу данных, которая содержит различные упражнения и мускулы, с которыми работает каждое упражнение. Для каждого упражнения у меня мог быть один muscles_worked TEXT
или же shoulders BOOLEAN, pecs BOOLEAN, lower_legs BOOLEAN, etc.
Я пытаюсь быть умным по отношению к системным ресурсам и поддерживать базу данных (как и любой прикрепленный код) настолько скудной, насколько это возможно, поэтому какой метод предпочтительнее?
Заранее спасибо.
1 ответ
Один метод, который будет работать с любой реляционной СУБД, становится очевидным, если вы используете язык отношений.
"У меня есть эти упражнения и эти мышцы. Как я могу сформировать отношения между ними, чтобы показать, какие мышцы задействованы в упражнении, а какие упражнения работают с каждой мышцей". Затем, когда вы объясняете, что "каждое упражнение может работать с несколькими мышцами, а каждая мышца может работать с помощью нескольких упражнений", тогда вы сразу получаете ответ.
Стандартная таблица пересечений или соединений:
create table Exercises(
ID int not null,
Name varchar( 16 ) not null, -- 'Bench Press', 'Chest Fly', etc.
...,
constraint PK_Exercieses primary key( ID )
);
create table Muscles(
ID int not null,
Name varchar( 16 ) not null, -- 'Pectorals', 'Biceps', etc.
...,
constraint PK_Muscles primary key( ID )
);
create table ExerciseToMuscle(
ExerciseID int not null,
MuscleID int not null,
...,
constraint PK_ExerciseToMuscle primary key( ExerciseID, MuscleID ),
constraint FK_ExerciseToMuscle_Exercise foreign key( ExerciseID )
references Exercises( ID ),
constraint FK_ExerciseToMuscle_Muscle foreign key( MuscleID )
references Muscles( ID )
);
Вы можете добавить атрибуты в таблицу пересечений, чтобы описать отношения. Таким атрибутом может быть Интенсивность, чтобы показать, насколько упражнение "поражает" мышцы.
ExerciseID MuscleID Intensity
17 4 5
17 3 10
Это показало бы, что Упражнение 17 поражает мышцу 3 с максимальным "ожогом" 10, а мышца 4 - только 5. Это позволяет вам отвечать на вопросы типа "Какие упражнения лучше всего подходят для моих четырехугольников?"