我想使用 mongodb 时间序列数据库来存储加密货币的交易数据。我们有 20 个交易所和 250 个币。我每 1 分钟存储一次交易数据,开盘价、最低价、最高价、收盘价。
我想要关于 如何存储数据的建议?
我现在想到的就是这个
我的第一种方法:我会用{exchangeName + coinName}创建一个集合,在metadata字段中,如果需要,我会插入任何字段。在查询数据时,我将根据 collectionName
获取数据我的第二种方法:我会创建一个集合Trade_data,然后插入带有ExchangeName和coinName的metadata字段。在查询数据时,我会根据Metadata
获取数据哪种方法最好,如果您有任何建议,可以放弃。
你的第一种方法更好,但仍然“不够好”。
首先不要把信息集中到两个字段中,每条数据都有一个字段,这样查询和编辑反而会变得更容易、更高效。这是文本形式的 ER 图:
Trades {
Exchange PK
BaseCoin PK
QuoteCoin PK
Timestamp PK
OpenPrice
LowPrice
HighPrice
ClosePrice
}
我的意思是复合主键(PK),因为这四个字段一起唯一地标识一个交易条目(用另一个术语来说,这里的每一行代表特定交易所上特定货币对的 1 分钟蜡烛数据).
下一个级别,为了更多的标准化,交易所和硬币是固定列表,因此它们可以放入自己的表中,而在交易中,您只需放置引用这两个表的外键(FK)。 ERD 变为:
Exchanges {
Name PK
}
Coins {
Name PK
}
Trades {
Exchange PK, FK1 -> Exchanges.Name
BaseCoin PK, FK2 -> Coins.Name
QuoteCoin PK, FK3 -> Coins.Name
Timestamp PK
OpenPrice
LowPrice
HighPrice
ClosePrice
}
上述的一个常见变体是使用自动 ID 或 GUID 作为表中的主键,但想法没有太大变化,只是细节变化。下面是对比图:
Exchanges {
ID PK
Name UK
}
Coins {
ID PK
Name UK
}
Trades {
ID PK
ExchangeID UK1, FK1 -> Exchanges.ID
BaseCoinID UK1, FK2 -> Coins.ID
QuoteCoinID UK1, FK3 -> Coins.ID
Timestamp UK1
OpenPrice
LowPrice
HighPrice
ClosePrice
}
其中“UK”表示唯一性约束(我们仍然需要该约束来确保数据的一致性)。
(FK和UK中的数字只是表示什么与什么合成,没有其他特殊含义。PK没有编号,因为无论是简单的还是复合的,一张表中总是只有一个PK。)
我希望至少能给你一些更具体的想法。如何对数据域进行建模在一定程度上与对“概念/功能需求”的分析和理解密切相关,另一方面,它与关系逻辑的概念、“数据库规范化”的概念相关。 特别是。