Хранение значений данных в нескольких таблицах против доступа к одному и тому же значению с помощью запроса - PullRequest
0 голосов
/ 29 декабря 2018

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

Мой вопрос заключается в том, будет ли считаться лучшей практикой никогда не хранить повторяющиеся данные ивсегда запрашивать или хранить небольшие значения несколько раз, чтобы уменьшить количество требуемых запросов?

Для контекста я создаю приложение Python, которое тестирует вопросы корейского языка с использованием SQLAlchemy и SQLite.

У меня есть классы User, Quiz и Question.

Значения, о которых идет речьявляются num_correct, num_wrong в отношении вопросов викторины.

В основном у меня есть таблица вопросов, в которой хранятся все вопросы, связанные с викториной quiz_id.У каждого вопроса есть столбец «правильный», в котором хранится логическое значение, указывающее, правильно ли был дан ответ на этот вопрос.

В моей таблице «викторины» есть столбцы для num_correct / num_wrong относительно вопросов, на которые даны ответы для этого теста.

В моей "пользовательской" таблице у меня также есть столбцы для num_correct / num_wrong, в которых указаны их правильные и неправильные ответы за все время.

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

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

Я пытался немного погуглить, но формулировать вопрос немного сложно.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Проблема дублированных данных является сложной в реляционных базах данных.Если ваше приложение выполняет модификации данных, то дублированные данные вызывают проблемы с синхронизацией - данные необходимо обновлять в нескольких местах.

Это плохо по ряду причин:

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

Базы данных do поддерживают эту возможность через свойства ACID, транзакции и триггеры.Тем не менее, они добавляют накладные расходы.В общем, такое дублирование добавляется по необходимости (т.е. производительности), а не заранее.Следовательно, существует строгое предпочтение для нормализованных моделей данных, в которых информация сохраняется только один раз, когда часто происходят обновления.

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

Это не только упрощает запросы, но и кодирует бизнес-логику .Одна из основных проблем с использованием данных заключается в том, что разные люди имеют немного разные определения вещей - это годовой клиент, который начал 365 дней назад?Кто-то, кто начал в тот же день в прошлом году?Кто-то, кто был вокруг в течение 12 месяцев?Стандартизированные таблицы анализа дают ответ.

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

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

0 голосов
/ 29 декабря 2018

Мой вопрос: будет ли целесообразнее никогда не хранить дублирующиеся данные и всегда запрашивать, или хранить небольшие значения несколько раз, чтобы уменьшить количество требуемых запросов?

Донне вижу, как это уменьшает количество запросов.

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

Если вы продублируете свои данные, то в итоге выйдет из синхронизации, и тогда у вас большие проблемы.

Короче говоря,не дублируйте.

Кроме того, этот вопрос не имеет никакого отношения к Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...