Лучше создать одну таблицу в sqlite или несколько таблиц? - PullRequest
0 голосов
/ 02 января 2019

Я создаю Android-приложение в Java, которое использует sqlite для хранения данных.Данные, которые я хочу сохранить, - это данные о тренажерном зале, такие как название упражнения, набор, репутация, вес и время.

У меня проблема, создаю ли я одну таблицу для всех упражнений, или у каждого упражнения есть таблица, такая как стол для жима лежа, стол для жима на наклонной поверхности и т. Д.

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

Также хорошо ли разрешать пользователю динамически создавать таблицы?(потому что, когда я разрешаю пользователю динамически создавать таблицы, имя таблицы не должно иметь пробелов, и я не знаю, как решить эту проблему)

Ответы [ 3 ]

0 голосов
/ 03 января 2019

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

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

  • Если количество пользователей и / или упражнений стало очень большим (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 таблицы: -

  1. user для специфической для пользователя информации, которая является единственной для пользователя.
  2. упражнение для каждого упражнения, которое можно выполнить
  3. log для каждого упражнения за каждое выполненное использование.

    • Обратите внимание, что пользователь и упражнение имеют столбец id , определенный с типом INTEGER PRIMARY KEY, это имеет особое значение в SQLITE в том, что он делает столбец псевдонимом специального / обычно скрытого rowid , и для этого id значение не указывается, тогда значение будет уникальным идентификатором строки (1 для первого, вероятно, 2 для следующего и скоро). Это наиболее эффективный способ определения строки, поэтому он используется в таблице журнала для ссылки на пользователя и упражнение.

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

После создания таблиц данные добавляются в 3 таблицы (3 пользователя, 4 упражнения и некоторые записи в журнале)

Наконец, выполняется запрос для накопления весов * повторений на пользователя в каждом упражнении в качестве примера связывания всего этого вместе. Результат: -

enter image description here

  • сумма - это то, что называется агрегатной функцией. Агрегатная функция будет учитывать все значения для группы (как определено ключевым словом GROUP BY). В случае sum все значения будут складываться вместе для каждой группы.

  • JOIN используется для объединения таблиц в соответствии с выражением (отношением).

0 голосов
/ 03 января 2019

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

Вы можете создавать таблицы с общими именами, такими как упражнение 1, упражнение 2, ... и т. Д., А затем использовать таблицы сопоставления для объединения имен упражнений и данных упражнений, но это может быть медленным.

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

0 голосов
/ 02 января 2019

Сначала вы можете нарисовать диаграмму ER для вашего приложения, а затем преобразовать ее в таблицы.Количество таблиц зависит от вашего варианта использования, но, как правило, в приложении имеется более одной таблицы.Попробуйте применить правила нормализации базы данных к вашим таблицам.https://en.wikipedia.org/wiki/Database_normalization

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

...