AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 289886
Accepted
Thomas
Thomas
Asked: 2021-04-16 10:40:41 +0800 CST2021-04-16 10:40:41 +0800 CST 2021-04-16 10:40:41 +0800 CST

具有永远不会改变的数据的表组织

  • 772

作为参考,我几乎所有的数据库经验都是使用 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 join
  • 1 1 个回答
  • 37 Views

1 个回答

  • Voted
  1. Best Answer
    J.D.
    2021-04-16T16:03:22+08:002021-04-16T16:03:22+08:00

    我不是对你的问题投反对票的人,所以我不能代表那个人发言,但我的猜测是因为你的问题有点抽象和罗嗦,这个网站通常是针对更直接和具体措辞的问题,那是反对者的推理,因为有点不清楚你的目标是什么/你在问什么。话虽如此,我同意在没有解释的情况下被否决是很烦人的,所以相反,你有我的赞成票,因为你的问题足够公平。?

    无论如何,我能说的是,你的数据大小听起来对 PostgreSQL 来说无关紧要。快速计算表明,按照您提到的新数据的速度,您在 10 年的时间跨度内仍将有不到 50 亿条记录。我什至不会太担心缓存,因为您的对象相当小(因此表中的单行不是很宽并且会很小)。

    如果您的Token对象和TokenLiquidity对象具有一对一的关系,那么将它们规范化为两个表或将它们非规范化为一个实际上并没有太大关系,因为您不会有数据冗余,并且行/表不会通过将它们组合到一张表中,总大小不会增长太多,因此也不必担心。

    如果关系 fromToken是一对多,TokenLiquidity那么情况就不同了,因为您最终会Token在表的多行中重复属性,如果其中一个属性的值发生变化TokenLiquidity,这会使管理变得更加困难。

    我个人推荐的唯一一件事是,因为它在结构上才有意义,是有第三个单独的表专门用于存储表的历史记录,LiquidityToken而且还专门只存储Token0Amount,Token1Amount和Address(也许还有一个用于记录whenDateTime的基础字段)字段以最小化数据冗余/最大化规范化。这将确保您的表尽可能轻巧,并且也使表的连接尽可能高效。历史表只会在需要时加入,如果你有这个字段,只在需要的时候加入。LiquidityTokenTokenDateTime

    • 0

相关问题

  • INNER JOIN 和 OUTER JOIN 有什么区别?

  • 存储过程可以防止 SQL 注入吗?

  • JOIN 语句的输出是什么样的?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve