Правильный дизайн БД для хранения огромного количества данных криптовалюты в БД

0

Я хочу хранить большое количество данных криптовалютности в db. Затем я хочу показать хорошие графические графики javascript с историческими ценами на веб-странице. Проблема в том, что я не уверен, какой дизайн базы данных лучше всего подходит для этой проблемы, я думал о Mysql DB, но, возможно, NOSQL db лучше в этом случае, я не знаю.

Что мне нужно:

  • Мне нужно отслеживать не менее 100 криптовых валют с историческими и текущими ценами и другой информацией о запасах, такой как объем и т.д....
  • Я собираюсь вставлять новые данные каждые 10 минут для каждого криптограммы ((6 записей/час * 24 часа * 365 дней) * 100 для каждого криптования = 5 256 000 новых записей в год)
  • Мне нужно запросить различные временные интервалы для каждой монеты, чтобы нарисовать график на веб-странице.

Моя идея:

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

Пример моей таблицы:

tbl_coin_detail:

id.   |Tick_name    | Name      |Algorithm   |Icon  

1     | BTC         |Bitcoin    |SHA256      |path/to/img   
2     | ETH         |Ethereum   |Ethash      |path/to/img
.
.
.

tbl_prices:

id  | price_USD     | price_EUR | datetime              | Volume_Day_BTC        | FK_coin       

1   | 6537.2        | 5 632,28  | 2018-07-01 15:00:00   | 62121.7348556964      | 1

2   | 466.89        | 401.51    | 2018-07-01 15:01:00   | 156373.79481106618    | 2
.
.
.

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

Можете ли вы указать мне в правильном направлении, как это решить? SQL DB или NOSQL, что лучше? Заранее спасибо.

  • 3
    Общее правило: Вы не можете выбрать стратегию оптимизации, не зная запросов, для которых нужно оптимизировать.
  • 1
    Возможно, вы захотите взглянуть на расширение шкалы времени PostgreSQL.
Теги:
bigdata
database-design
nosql

2 ответа

1

Рекомендации MySQL...

У вас есть Volume_Day_BTC, но вы говорите "6 записей/час" - это запись ежедневно или более мелкозернистая.

Объем данных не настолько велик, но будет полезно сжать типы данных до начала работы.

id не требуется; вместо этого используйте PRIMARY KEY(coin, datetime).

Подумайте над типом данных о ценах и объемах. С одной крайности - пространство (следовательно, несколько, скорость); с другой, точность.

DOUBLE -- 8 bytes, about 16 significant digits, large range
DECIMAL(17, 11) -- 8 bytes, limited to $1M and 11 decimal places (not enough?)
DECIMAL(26, 13) -- 12 bytes, maybe big enough?
etc.

Было бы хорошо суммировать данные за, скажем, один месяц, чтобы сэкономить место? Почасовое или ежедневное avg/hi/low и т.д. Это было бы очень полезно для ускорения сбора данных для графического отображения.

В частности, я рекомендую хранить сводную таблицу с монетой + день с объемом, ценой и т.д. Рассмотрите возможность использования FLOAT (4 байта, 7 значащих цифр, достаточный диапазон), что более чем достаточно для графического отображения.

Итак, я рекомендую 3 таблицы:

Coins -- 100 rows with meta info about the currencies.
Prices -- 5M rows/year of details -- unless trimmed  (400MB/year)
Summary -- 36500 rows/year for graphing range more than, say, a week. (4MB/yr)

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

Используйте InnoDB.

Сводные таблицы

  • 0
    Привет Рик, спасибо за ценную информацию. Я не знал о сводных таблицах. Я читал целый день об этой проблеме, все указывали на совокупные временные ряды. Я понимаю, если у меня есть 10 минут. данные в дБ, глупо выбирать их на графике с 3-месячным увеличением, лучше, например, отправлять данные за 1 день. Я вижу, как coinmarketcap.com решает проблему как-то так: увеличьте все для отображения на btc 3-дневный график, 1-дневный увеличенный дисплей 5-минутный график. Как обрабатывать эти данные масштабирования. Мне нужны сводные таблицы с данными за 10 минут, час, день, 3 дня. Мне нужно агрегировать данные с помощью запросов MySQL, таких как группировка по часам, дням. Или другая техника
  • 1
    Базовая таблица содержит данные за 10 минут. Данные 3-х данных могут быть легко и эффективно извлечены из данных дня. Они «масштабируют», делая новый SELECT и создавая графики с нуля.
Показать ещё 2 комментария
0

Честно говоря, это далеко не "огромный". Мы не говорим здесь о миллиардах записей, поэтому любая правильно проиндексированная БД будет в порядке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню