Дублирующиеся данные против вычисленных данных в базе данных - PullRequest
0 голосов
/ 26 февраля 2019

Я начинаю отслеживать множество переменных вокруг моей жизни (QuantifiedSelf).У меня много источников ввода, и я работаю над тем, чтобы вставить все это в базу данных.Я планирую использовать эту базу данных с R, чтобы задавать произвольные вопросы о моей жизни («Какие маршруты работают быстрее всего» или «Какие продукты влияют на мое настроение» и т. Д.)

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

Примеры «процесса»:

  1. Некоторые измой вход - это список настроений (по одному на каждый день).На данный момент доступно только 5 настроений (имя с рейтингом от -2 до 2).Должен ли я нормализовать эти данные и создать две таблицы: таблицу Mood (с 5 элементами) и таблицу DailyMood?

    • Если я обработаю данные, я потеряю исходные данные.Возможно, я изменил настроение, чтобы иметь другое имя.Если я делаю это в нормализованной базе данных, то я теряю информацию о том, что до изменения у меня было настроение «oldName»
    • Если я не обрабатываю данные, то у меня дублирование данных
  2. Другой вход - это список местоположений GPS (широта, долгота).Однако большую часть моего дня я провожу в одном месте или провожу за рулем.Обрабатывать ли эти данные для создания двух таблиц «Местоположения» и «Маршруты»?

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

Однако я чувствую, что застрял между двумя противоположными "идеалами":

  1. Если я обработаю данные, то у меня не будет исходных данных.
  2. Если я не обрабатываю данные, у меня есть дубликаты, трудно используемые данные.

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

1 Ответ

0 голосов
/ 27 февраля 2019

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

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

Если бы это был я, я бы создал таблицу настроения с двумя атрибутами:

  • Имя
  • Идентификатор (pk)

Эта таблица по существу будет служить таблицей определения.Здесь вы можете добавить атрибуты, специфичные для настроения (например, описание).

Затем я бы создал таблицу MoodHistory со следующими атрибутами: - Метка времени - MoodId - IsCurrent (Boolean)

Перед вамивведите настроение в вашем приложении, ОБНОВЛЕНИЕ MoodHistory SET IsCurrent = 0, ГДЕ IsCurrent = 1, а затем вставьте новую запись с IsCurrent = 1. Эта структура нормализуется и путем индексации или разбиения по столбцу IsCurrent (и, честно говоря, даже без индексации /разделение), даже если ваша таблица становится достаточно большой, вы всегда сможете супер быстро запросить текущее настроение.

Для вашего второго варианта использования это весьма зависит не только от вашего запланированного использования, но и от того, гдеданные поступают из (особенно для маршрутов).Я не уверен, как вы планируете группировать местоположения в «маршруты», но если вы укажете в комментариях, я с радостью добавлю к своему ответу.

Для местоположений, однако, я предполагаю, что вы 'снимок местоположения в течение некоторого установленного интервала времени.Я бы создал таблицу LocationSnapshot, структурированную аналогично таблице MoodHistory:

Затем я создал бы таблицу MoodHistory со следующими атрибутами:

  • Отметка времени
  • Широта
  • Долгота
  • IsCurrent Обрабатывая данные IsCurrent аналогично данным MoodHistory, захватить последнее введенное местоположение должно быть довольно просто.Вы также можете выполнить дополнительную обработку, если хотите избежать дублирования.По сути, перед обновлением IsCurrent запросите строку, в которой IsCurrent = 1. Затем сравните эти записи Широта и Долгота с вашими новыми Широтой и Долготой, прежде чем вставлять новую запись.Если есть какие-либо изменения, перейдите к вставке, в противном случае нет необходимости вставлять новую запись.

Вы также можете создать таблицу известных местоположений, например KnownLocation:

  • Широта
  • Долгота
  • Имя

Присоединение к этой таблице ВКЛ. Широта и Долгота должны сообщать вам, когда вы проводите время в определенном месте, скажем «Домой»."против" работы "

...