作为参考,我几乎所有的数据库经验都是使用 mongodb,这是我的第一个 postgres 项目。
我正在存储来自去中心化金融加密池的数据更新。
我正在探索的数据结构非常简单。有令牌:
type Token =
{
Address: string // primary key
Decimals: int
Symbol: string
}
这些数据永远不会改变,但会在任何地方被引用;大约 2k 个条目
type LiquidityToken =
{
Address: string // primary key
Symbol: string
Token0Address: string // matches the address from a token above
Token1Address: string // matches the address from a token above
Timestamp: DateTime // changes at every update
Token0Amount: decimal // changes at every update
Token1Amount: decimal // changes at every update
}
这每 5 分钟更新一次,但是只有 Token0Amount 和 Token1Amount 发生变化,我想保留历史记录。
我大约有 500 个这样的对象,每 5 分钟更新一次,因此每天有 140k 新条目。
所以我想做的第一件事是在 Token0/1Address 字段和 Token 记录之间进行连接,但是由于 Token 只是添加了一个 int 和一个短(最多 32 个字符,但通常 < 8 个字符)字符串,我想知道这是否节省了很多(我不知道加入占用了多少空间)。
然后我想知道将对象分成两部分是否值得:
type LiquidityToken =
{
Address: string // primary key
Symbol: string
Token0Address: string // matches the address from a token above
Token1Address: string // matches the address from a token above
}
和
type LiquidityTokenUpdate =
{
Address: string // matches the address of the liquidity token
Timestamp: DateTime // changes at every update
Token0Amount: decimal // changes at every update
Token1Amount: decimal // changes at every update
}
并复制这个对象。但是现在一个查询可能会拉取更新,这会拉取流动性代币,该代币必须拉取 2 个代币对象。
由于这是针对公共 GraphQL 接口的,因此可能会弹出很多使用模式。我无法预测特定类型的查询,因为这是我想在准备好后向社区公开的内容。
我知道缓存是我的朋友,因为静态数据很小,所以它都适合 RAM,但总的来说,尝试节省空间(每条记录不是很大)并增加连接或查找的成本是否有意义在本地缓存中,还是在每次更新时保存所有内容更好,因为磁盘毕竟便宜?
请在上下文中说明这不是我有过的经验;我已经阅读过有关联接、规范化与非规范化表等的信息,但我没有这方面的实践经验。我处理了非常大的数据集,但在非 SQL 上下文中,这是我第一次来这里,所以我希望这个问题提供了所需的信息:D
我不是对你的问题投反对票的人,所以我不能代表那个人发言,但我的猜测是因为你的问题有点抽象和罗嗦,这个网站通常是针对更直接和具体措辞的问题,那是反对者的推理,因为有点不清楚你的目标是什么/你在问什么。话虽如此,我同意在没有解释的情况下被否决是很烦人的,所以相反,你有我的赞成票,因为你的问题足够公平。?
无论如何,我能说的是,你的数据大小听起来对 PostgreSQL 来说无关紧要。快速计算表明,按照您提到的新数据的速度,您在 10 年的时间跨度内仍将有不到 50 亿条记录。我什至不会太担心缓存,因为您的对象相当小(因此表中的单行不是很宽并且会很小)。
如果您的
Token
对象和TokenLiquidity
对象具有一对一的关系,那么将它们规范化为两个表或将它们非规范化为一个实际上并没有太大关系,因为您不会有数据冗余,并且行/表不会通过将它们组合到一张表中,总大小不会增长太多,因此也不必担心。如果关系 from
Token
是一对多,TokenLiquidity
那么情况就不同了,因为您最终会Token
在表的多行中重复属性,如果其中一个属性的值发生变化TokenLiquidity
,这会使管理变得更加困难。我个人推荐的唯一一件事是,因为它在结构上才有意义,是有第三个单独的表专门用于存储表的历史记录,
LiquidityToken
而且还专门只存储Token0Amount
,Token1Amount
和Address
(也许还有一个用于记录whenDateTime
的基础字段)字段以最小化数据冗余/最大化规范化。这将确保您的表尽可能轻巧,并且也使表的连接尽可能高效。历史表只会在需要时加入,如果你有这个字段,只在需要的时候加入。LiquidityToken
Token
DateTime