如何在PostgreSQL数据库中存储类似哈希表的对象?

4

首先,提供一些信息。我的Rails应用程序有一个名为Neo的模型,其中包含属性observed_atradec

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

我该如何实现这个?我不介意使用hstore,但我更喜欢不使用,因为相关文档很少。


最简单的方法是使用一个四列表格,其中三列为“观测时间(observed_at)”,“赤经(ra)”和“赤纬(dec)”,第四列用于存储一组数据的标识符。你将使用哪些数据类型来定义这些列? - Mike Sherrill 'Cat Recall'
observed_at 显然是一个日期。radec 都是浮点数。然而,每个 Neo 都有多组这些数据。 - Soham Chowdhury
2个回答

6
您可以使用更简单的 serialize,而不是 hstore。
或者,您可以为这些集合创建一个模型,然后在 Neo 上使用 has_many,并在新模型上使用 belongs_to

第二个选项现在正好适合我。无论如何,感谢您的帮助。 - Soham Chowdhury
1
我不太喜欢在数据库中序列化特定于语言的对象。当您升级语言运行时或更改对象结构时,它们会带来很大的麻烦,而且当您需要用另一种语言、报表引擎等与数据库进行通信时,它们会非常令人沮丧。简单的一对多关系是一个更明智的方法。 - Craig Ringer

3
如Guilherme Berger所述,1:many关系是建模“列表的列表”或更精确地说是“集合的集合”的典型方法;为了给它排序,您必须在每个子表中定义某种排序键。
当使用PostgreSQL时,您另一个选项是使用多维数组。不幸的是,Pg的数组有点奇怪,因为二维数组更像矩阵(即:固定维度),而不是列表的列表。如果您的子列表长度相同,那么就没有问题,但如果它们是可变且无限长度的数组,则数组中的数组不是一个好选择。
我主要提到这一点来达到完整的目的,并解释将语言特定对象序列化到数据库中不是正确的方法。第一次更新到新的主要运行时版本,更改对象结构或从不同的语言或报告引擎访问数据库时,情况会非常糟糕。我确实不建议这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接