【问题标题】:How to store hash-like objects in a PostgreSQL database?如何在 PostgreSQL 数据库中存储类似哈希的对象?
【发布时间】:2013-04-20 12:06:44
【问题描述】:

首先,一些信息。我的 Rails 应用程序有一个名为 Neo 的模型,它又具有属性 observed_atradec

但是,我现在发现我需要存储这些数据的集合(以类似 Python 的方式,它将是一个元组列表。)在 Ruby 中,可能是一个列表列表。

我怎样才能做到这一点?我不介意使用hstore,但我不想这样做,因为上面的文档很少。

【问题讨论】:

  • 最简单的方法是在一个四列的表中——三列用于“observed_at”、“ra”和“dec”,第四列用于存储集合的标识符。您对这些列使用什么数据类型?
  • observed_at 显然是一个日期。 radec 都是浮点数。但是,每个Neo 都有多组这些。

标签: ruby-on-rails ruby-on-rails-3 postgresql hstore


【解决方案1】:

您可以使用更简单的serialize,而不是 hstore。

或者,您可以为这些集合创建一个模型,然后在 Neo 上使用 has_many,在新模型上使用 belongs_to

【讨论】:

  • 第二个选项现在击中了我。无论如何感谢您的帮助。
  • 我不是数据库中序列化语言特定对象的忠实粉丝。当您升级语言运行时或更改对象结构时,它们是一个主要的痛苦,当您需要使用另一种语言、报告引擎等与数据库对话时,它们会非常令人沮丧。简单的 1:m 关系是更理智的方法。
【解决方案2】:

正如 Guilherme Berger 所指出的,1:many 关系是建模“列表列表”的典型方法......或者更准确地说,是一组 集合;要给它order,你必须在每个子表中定义某种排序键。

使用 PostgreSQL 时向您开放的另一个选择是使用多维数组。不幸的是,Pg 的数组有点奇怪,因为二维数组更像是一个矩阵(即:固定维度)而不是列表的列表。如果您的子列表的长度相同,那很好,但如果它们是可变且无限长度的数组,则数组不是一个好的选择。

我提到这一点主要是为了完整性,并解释在数据库中序列化特定于语言的对象不是在这里采用的正确方法。第一次必须更新到新的主要运行时版本、更改对象结构或从不同的语言或报告引擎访问数据库时,这将是可怕的。我真的不推荐它。

【讨论】:

    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多