Mongodb Timeseries:如何设计/管理贸易数据的集合和元数据

问题描述 投票:0回答:1

我想使用 mongodb 时间序列数据库来存储加密货币的交易数据。我们有 20 个交易所和 250 个币。我每 1 分钟存储一次交易数据开盘价、最低价、最高价、收盘价。

我想要关于 如何存储数据的建议?

我现在想到的就是这个

我的第一种方法:我会用{exchangeName + coinName}创建一个集合,在metadata字段中,如果需要,我会插入任何字段。在查询数据时,我将根据 collectionName

获取数据

我的第二种方法:我会创建一个集合Trade_data,然后插入带有ExchangeName和coinNamemetadata字段。在查询数据时,我会根据Metadata

获取数据

哪种方法最好,如果您有任何建议,可以放弃。

database mongodb architecture time-series database-schema
1个回答
0
投票

你的第一种方法更好,但仍然“不够好”。

首先不要把信息集中到两个字段中,每条数据都有一个字段,这样查询和编辑反而会变得更容易、更高效。这是文本形式的 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。)

我希望至少能给你一些更具体的想法。如何对数据域进行建模在一定程度上与对“概念/功能需求”的分析和理解密切相关,另一方面,它与关系逻辑的概念、“数据库规范化”的概念相关。 特别是。

© www.soinside.com 2019 - 2024. All rights reserved.