Это лучший способ сохранить эти данные? - PullRequest
0 голосов
/ 22 марта 2019

начнем с того, что я новичок в проектировании баз данных, но намереваюсь перейти на SQLite для одного из моих проектов с python, чтобы сделать чтение данных более эффективным.В настоящее время у меня есть древовидная структура моих данных, хранящихся для игры, которая записывается ежечасно.У меня есть дерево папок в следующем формате: Имя пользователя / Год / Месяц / Дата / Время.csv

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

enter image description here

Итак, некоторые пояснения по каждому из них:

  • сервердает сервер, на котором пользователь вошел в систему (на момент записи)
  • UserExperience запишет все увиденные навыки, в которых опыт был приобретен в течение часа (и сколько опыта).Таким образом, совокупность за час
  • Это то, в чем я действительно не уверен - UserActivites.Это может быть переменный текст некоторых событий, которые могли произойти в течение часа («Я выровнял Х умение до уровня Y», «Я убил Z многих из босса А», «Я выполнил квест В») и еще много других, которые добавляются иубрал сверхурочно, поэтому не то, что я могу точно сделать первичным ключом.Я не совсем уверен, что можно сделать здесь.

Любая помощь будет очень признателен: D не стесняйтесь просить каких-либо разъяснений.Также не совсем уверен, как бы я делал запросы для получения статистики некоторого набора пользователей между двумя датами, но это отдельная проблема

Спасибо за любые ответы!

1 Ответ

1 голос
/ 22 марта 2019

Таким образом, активность (в UserActivites ) всегда относится к (со временем, может увеличиваться) Деятельности справочной таблице.Текстовое представление действия находится в таблице «Действия», и вы просто ссылаетесь на него из таблицы «UserActivities» - пока что все в порядке.У вас уже есть внешний ключ, указывающий от UserActivities.ActivityID до Activities.ActivityID (и то же самое для имени пользователя для UserStatus)?

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

Что сделает I :

  • выбросит объединенный первичный ключ в UserActivities
  • создание бессмысленного, автоинкрементного целочисленного первичного ключа в таблице UserActivities (ID INTEGER PRIMARY KEY)

Вещи, которые вы должны учитывать:

  • создать индекс для имени пользователя и еще один для ActivityID в UserActivities;это необязательно, но рекомендуется, чтобы столбцы внешних ключей дочерних ключей имели индекс (https://sqlite.org/foreignkeys.html#fk_indexes)

. Таким образом, ваш дизайн данных выглядит хорошо. Вы упомянули "и удалили сверхурочно" относительно действий пользователя (если я правильно понял). Если это так, я бы создал логический столбец в UserActivities для удаленных записей. Таким образом, вы можете анализировать действия, которые были удалены. I будетникогда не удаляйте записи, если они были созданы в базе данных.

...