Нормализация является одним из ключевых понятий для проектирования базы данных и таблиц в ней, то есть для сведения к минимуму / устранения дублирования данных (особенно текстовых данных, которые в отношении хранения и обработки неэффективны).
Таким образом, в основном ответом является ДА у вас должно быть несколько таблиц, НО НЕТ у вас не должно быть динамически назначенных таблиц для каждого пользователя, одной пользовательской таблицы вместе с отображением пользователей к выполненным упражнениям это то, что обычно используется.
- Если количество пользователей и / или упражнений стало очень большим (10, возможно, 100 тысяч), тогда вам, возможно, потребуется рассмотреть некоторую форму разделения.
По звуку у вас есть таблица для упражнений, таблица для пользователей, а затем таблица, в которой записываются (записываются) выполненные упражнения, которые будут отображаться для пользователя и упражнения.
В качестве примера рассмотрим следующее: -
DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS exercise;
DROP TABLE IF EXISTS log;
CREATE TABLE IF NOT EXISTS user (user_id INTEGER PRIMARY KEY, user_name TEXT, user_password TEXT);
CREATE TABLE IF NOT EXISTS exercise (exercise_id INTEGER PRIMARY KEY, exercise_name TEXT);
CREATE TABLE IF NOT EXISTS log (user_id_reference INTEGER, exercise_id_reference INTEGER, started TEXT DEFAULT CURRENT_TIMESTAMP, finished TEXT DEFAULT 0, repititions INTEGER, weight REAL);
INSERT INTO user (user_name, user_password) VALUES ('Fred','passwordFred'),('Mary','passwordMary'),('Linda','passwordLinda');
INSERT INTO exercise (exercise_name) VALUES ('Goblet Squat'),('Farmer''s Walk'),('Bent-Over Row'),('2 Armed Stiff-Legged DeadLift');
INSERT INTO log VALUES
(2,3,'2018-12-31 10:30','2018-12-31 10:45',100,5.5),
(2,1,'2018-12-31 10:50','2018-12-31 11:00',50,7.5),
(2,3,'2019-01-01 10:25','2019-01-01 10:30',75,5.5),
(1,1,'2018-12-30 09:00','2018-12-30 09:10',60,6.5),
(1,1,'2018-12-31 09:00','2018-12-31 09:10',60,6.5),
(1,1,'2019-01-01 09:00','2019-01-01 09:10',60,6.5);
SELECT sum(repititions * weight) AS workdone, user_name, exercise_name
FROM log
JOIN exercise ON exercise.exercise_id = log.exercise_id_reference
JOIN user ON user.user_id = user_id_reference
GROUP BY user_id, exercise_id
ORDER BY user_name;
Это создает 3 таблицы: -
- user для специфической для пользователя информации, которая является единственной для пользователя.
- упражнение для каждого упражнения, которое можно выполнить
log для каждого упражнения за каждое выполненное использование.
Обратите внимание, что пользователь и упражнение имеют столбец id , определенный с типом INTEGER PRIMARY KEY
, это имеет особое значение в SQLITE в том, что он делает столбец псевдонимом специального / обычно скрытого rowid , и для этого id значение не указывается, тогда значение будет уникальным идентификатором строки (1 для первого, вероятно, 2 для следующего и скоро). Это наиболее эффективный способ определения строки, поэтому он используется в таблице журнала для ссылки на пользователя и упражнение.
log - это то, что некоторый термин, такой как таблица сопоставления / ссылки, облегчает отношения многие ко многим, дополнительно значения, специфичные для журнала, такие как дата / время начала и окончания используемых весов и повторы хранятся в журнале.
После создания таблиц данные добавляются в 3 таблицы (3 пользователя, 4 упражнения и некоторые записи в журнале)
Наконец, выполняется запрос для накопления весов * повторений на пользователя в каждом упражнении в качестве примера связывания всего этого вместе. Результат: -
![enter image description here](https://i.stack.imgur.com/9il6a.png)
сумма - это то, что называется агрегатной функцией. Агрегатная функция будет учитывать все значения для группы (как определено ключевым словом GROUP BY). В случае sum все значения будут складываться вместе для каждой группы.
JOIN используется для объединения таблиц в соответствии с выражением (отношением).