Хранить трехмерную таблицу в базе данных, где одно измерение увеличивается со временем - PullRequest
0 голосов
/ 01 августа 2020

У меня есть набор данных с тремя измерениями, которые я хотел бы сохранить для использования на веб-сайте:

  1. Список компаний (около 1000)
  2. Информация о компании (около 15 вещей)
  3. Время (ежемесячно)

По сути, я хочу отслеживать эту информацию с течением времени и поддерживать ее в актуальном состоянии.

Когда я начинаю , данные будут иметь размер 1000x15x1, через год это будет 1000x15x12, а через 10 лет - 1000x15x120.

Основные запросы, которые я бы сделал:

  • Получить всю информацию для одной компании за все время
  • Получить всю информацию за одно конкретное время

Какая конфигурация базы данных будет хорошей для этого? Я открыт для решений SQL или не SQL.

В случае необходимости веб-сайт находится на Google App Engine.

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

С точки зрения дизайна схемы реляционной базы данных:

Если целью является только аналитика / ad-ho c запросы / OLAP в целом, то вы можете использовать звездообразную схему, которая хорошо подходит для такого типа аналитики. Но будьте осторожны, базы данных OLAP ненормализованы и не подходят для оперативного хранилища транзакций / OLTP в целом, если вы планируете использовать и то, и другое в этой базе данных.

Красота схемы Star:

  • Таблицы fact обычно все числовые c, что делает таблицы очень маленькими, даже если записей слишком много. Маленькая таблица означает, что ее очень быстро читать (ввод-вывод).

  • Все соединения из таблицы фактов в таблицы измерений основаны на внешних ключах (один столбец, число c, индексируемые внешние ключи)

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

  • В таблицах фактов во внешних ключах нет NULL. Это упрощает JOIN операций, то есть всегда JOIN таблицу фактов для всех ее таблиц измерений. Если вам нужен регистр NULL, вам нужно добавить его как особый случай в таблицу измерений. Например: если компания не котируется на фондовом рынке, и одна из вещей, которые вы отслеживаете, это цена акций, тогда вы вводите 0 или NULL в факт для таблицы цен акций в зависимости от (как вы хотите выполнить СУММ ( ), AVG () et c позже), а затем добавьте особый случай в таблицу измерений StockSymbols под названием «Частная компания» и добавьте внешний ключ этого особого случая в таблицу фактов в качестве внешнего ключа.

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

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

Все это делает JOIN операции очень быстрыми, простыми и понятными. Вот почему схема Star лежит в основе проектов хранилищ данных.

https://en.wikipedia.org/wiki/Star_schema https://en.wikipedia.org/wiki/Data_warehouse

На один уровень выше этого - это OLAP (например, SSAS SQL Server Analyses Services), который выполняет предварительную обработку данных, чтобы ускорить запрос, но требует большего обучения, чем чистая стартовая схема, и в вашем случае это излишество

Для вашего примера

В схеме Star

  • Компании будут таблицей измерений

  • Вы понадобится Месяц размерность таблица. Это упрощенная версия измерения даты, только для информации о месяце. Пример измерения даты здесь.

https://www.codeproject.com/Articles/647950/Create-and-Populate-Date-Dimension-for-Data-Wareho

  • Информация о компании (15 вещей, которые вы скажем) будут таблицами фактов. Факты должны быть числовыми c (b / c в идеале все нечисловые c значения сохраняются в таблицах измерений). Это означает перенос нечисловой c части факта в таблицу измерений. Например: если вы сохраняете доход и хотели бы сохранить и тип валюты, тогда вам потребуется измерение «Валюта» и сохранить только сумму в таблице фактов и внешний ключ в таблице измерения «Валюта».

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

  • Также факты могут быть сгруппированы по степени их детализации. Например, у вас может быть таблица фактов company_monthly_summary и хранить более одного факта в этой таблице (все они присоединяются к измерению «Компания» и измерению «Месяц»). Все зависит от вас, как вы хотите сгруппировать таблицу фактов. Но если их степень детализации не совпадает, их не следует группировать, так как это вызовет разреженные таблицы фактов и усложнит запрос.

  • Вы будете использовать внешние ключи в таблицах фактов для присоединения к вашим Таблицы измерений

  • Добавьте индекс для наиболее часто используемых столбцов ваших таблиц измерений

  • Добавьте суррогатный ключ numeri c к вашему измерению. Обычно это число автоматически увеличивается, но это зависит от вас. Одно исключение, которое люди предпочитают для суррогатного ключа измерения даты, - это использование формата ГГГГММДД (как целое число). Это упрощает работу с предложением WHERE: то есть вместо фильтрации столбца Date (значение DATETIME), который будет выполнять поиск суррогатных ключей, вы просто предоставляете суррогатные ключи напрямую b / c вы знаете формат . В зависимости от области вашего бизнеса у вас могут быть другие похожие полезные шаблоны суррогатных ключей, которые вы, возможно, захотите рассмотреть и использовать. Но знайте: в случае изменения бизнес-домена вам придется обновить все записи фактов. Простой суррогатный ключ с автоинкрементом не имеет этой проблемы. В вашем случае суррогатный ключ для месяца может быть фактическим номером месяца (1 для января)

При этом 1 миллион строк за 5 лет легко запросить даже без звезды -схема (при правильной индексации, ведении базы данных). Но если это часть более крупной системы аналитики, то go со схемой Star

0 голосов
/ 01 августа 2020

Самый простой способ.

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

Пример:

СОЗДАТЬ ТАБЛИЦУ tablename (

id int(11) NOT NULL AUTO_INCREMENT,

companyname varchar(255) ,

info1 int(11) NOT NULL,

info2 datetime ,

info3 varchar(255) ,

info4 bool ,

yearmonth datetime,

PRIMARY KEY (id));

# запросы

select * from tablename, where companyname = "nameofthecompany";

select * from tablename, где yearmonth = "год-месяц"; # можно использовать здесь

...