mysql - 正确的数据库设计,在数据库中存储大量的股票加密货币数据

标签 mysql sql database-design nosql bigdata

我想在数据库中存储大量加密货币数据。然后我想在网页上显示带有历史价格的漂亮 JavaScript 价格图表。 问题是我不确定哪种数据库设计最适合这个问题,我正在考虑 Mysql DB,但在这种情况下 NOSQL db 可能更好,我不知道。

我需要什么:

  • 我需要跟踪至少 100 种具有历史和历史记录的加密货币 当前价格和其他股票信息,如成交量等……
  • 我将每 10 分钟为每个加密插入一次新数据 ((6 记录/小时 * 24 小时 * 365 天) * 每个加密 100 = 5 256 000 每年新纪录)
  • 我需要查询每种代币的不同时间范围才能在网页上绘制图表。

我的想法:

我提出了这个解决方案,但我需要知道这是否可以,或者我完全错误且天真。 在这种情况下,我将有 2 个表,第一个父表将在其中存储有关硬币的所有必要信息,子表将在其中存储所有价格,但该子表必须包含大量数据,这让我感到担忧。

我的表结构示例:

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 哪个更好? 预先感谢您。

最佳答案

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.

是否可以汇总一个月内的数据以节省空间?每小时或每日平均/高/低等。这对于加快获取绘图数据非常有用。

特别是,我建议按币+日保留一个包含交易量、价格等的汇总表。考虑使用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。

Summary tables

关于mysql - 正确的数据库设计,在数据库中存储大量的股票加密货币数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51211782/

相关文章:

MySQL 加入 ON 列 a IN(列 b)

php - 我们可以在不等于的情况下使用 whereIn 子句吗

mysql - 如何将 form/golang 中的连接池连接到没有数据库的实例?

mysql - mysql Group concat 有最大限制吗?

sql - 为什么 SQL Server 试图将我的 nvarchar(20) 数据类型转换为 int?

sql - 数据库中的货币兑换

mysql - 为 MySQL 中不断增长的表创建摘要表的最佳实践

javascript - node.js + MySQL & JSON-result - 回调问题 & 对客户端无响应

sql - 使用 SQL 语句调试 Shell 脚本时出错到 V_$UNDOSTAT

database - 动态联系人数据库