【问题标题】:Better data type to store a long ID更好的数据类型来存储长 ID
【发布时间】:2021-03-18 21:51:16
【问题描述】:

我正在使用 Rails 开发一个项目。在这个应用程序中,我们使用 OAuth 来启用 Facebook 和 Google 注册/登录。我想将各种提供者(FB 或 Google)以及与这些提供者关联的用户 ID 存储在与用户相关的单独表/模型中。

我的问题是下一个问题,FB 和 Google 提供的用户 ID 是很长的数字(Google 是 21 位数字)。将其存储为整数或更好地将其存储为字符串是否有意义?这两个选项的优缺点是什么?

我使用的是 Postgres 10.14。

【问题讨论】:

  • 这将在很大程度上结束一个意见,我将它们存储为一个字符串。你的价值观来自你无法控制的外部来源,我建议你不要用它们计算任何东西。你能确保你永远不会允许使用字母数字方案的其他来源吗?
  • @Belayer:虽然假设数字都是数字(并且可能基于该假设进行编码),但我不希望其他字符偷偷溜进来,所以没有字符串类型。如果发生这种情况,我希望立即收到错误消息。第一个问题:假设所有数字是否合理?
  • @ErwinBrandstetter:这就是为什么我说它最终将主要是意见。同意,我不希望角色值潜入,但如果没有控制,我无法阻止故意将角色放在那里。至于你的第一个问题 - 不,但是从 2 的宇宙来看,假设它必须是全数字也是不合理的。所以我的第一个问题略有不同:假设它们必须全是数字是否合理。如果我想验证来自多个外部实体的数据,而我无法指定数据格式,那么我需要为每个实体使用不同的验证例程。

标签: ruby-on-rails postgresql types numeric


【解决方案1】:

您不能在 Postgres 整数列中存储那么多数字。 bigint 最多允许 19 位数字(9223372036854775801 是最大的正数:2^63-1)。

虽然数字都是数字,但最有效、精确的数据类型是numeric。手册:

实际的存储要求是每组四个十进制数字需要两个字节,加上三到八个字节的开销。

存储为numeric 的21 个十进制数字将占用RAM 中的18 个字节和磁盘中的15 个字节。见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2018-01-15
    • 2023-03-03
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多