Несколько логических полей или одно текстовое поле в базе данных?

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

Чтобы привести конкретный пример: я создаю базу данных, которая содержит различные упражнения и мускулы, с которыми работает каждое упражнение. Для каждого упражнения у меня мог быть один 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. Это позволяет вам отвечать на вопросы типа "Какие упражнения лучше всего подходят для моих четырехугольников?"

Другие вопросы по тегам