PostgreSQL - 整数[]最佳实践

时间:2011-01-25 18:20:16

标签: java sql postgresql jdbc ibatis

最近在Web应用上工作我决定在数据模型中使用integer []。有2个表,一个有文章数据,第二个有标签(标签ID和描述),决定标签ID,文章将在article.tags integer []列中标记。

正如Milen A. Radev所指出的那样:

  

提示:数组不是集合;搜索特定的数组元素可能是数据库错误设计的标志。考虑为每个将成为数组元素的项使用一个单独的表。这将更容易搜索,并且可能更好地扩展到大量元素。

不仅如此,但是必须使用JDBC和iBatis来处理整数[],我应该说“有趣”。

目前,我可以完成我必须做的工作实施。为了简单起见,它可能会使用一个存储article.id和tag.id关系的单独表来重新工作。

最后,我对最好用于什么语境的整数[]感到困惑?

我想我已经找到了最好的方法。

5 个答案:

答案 0 :(得分:5)

在处理注释线程等树结构时,我在PostgreSQL中使用过数组。您可以将路径从根目录存储到节点作为分支编号数组。然后,以正确的显示顺序拉出整个树是一个简单的问题:

SELECT stuff
FROM comments
WHERE thread = X
ORDER BY path -- This would be the array.

PostgreSQL以唯一合理的方式比较数组。从根用于路径的数组也为您提供了一种计算节点深度的简便方法。你可以使用一个字符串(每个分支号码有3个base-96位数字)和ASCII-betical排序用于相同的目的,但数组更清晰。

是的,还有其他处理树木的方法,这些方法更加迂腐,但使用阵列提供了清晰的实现。如果我正在进行大量的树操作,那么维护路径数组会涉及很多繁忙的工作,所以我可能会使用不同的表示。

不完全是Java特定的,但有些情况下数组是手头数据的自然和有用的表示(即使在SQL中)。

答案 1 :(得分:4)

恕我直言,因为任何阵列都违反了1NF,最好的背景是:......(鼓声).....无。

这就解决了为什么我们要拥有不打算查询的数据的问题。所有值都是可以搜索的,如果我们不应该在可搜索的值上使用数组,我们再次得出结论它永远不值得使用。

这只留下了一个假设的情况,即您只是为了在客户端上进行分析和操作而存储数组。我确信这些存在,但不符合我的经验。

编辑:上面我说,“我确定这些存在......”看看@mu的答案太短了。

答案 2 :(得分:4)

我可以想到三个应用程序:

第一个是非规范化。权衡包括:您不能单独更新或处理元素。但是一次轻松快速地获取所有这些内容。它还节省了大量空间。

第二个稍微相关的是,您使用的数组不是用于存储而是用于某些中间处理。例如,如果您希望以非SQL语言批量处理数据,而该语言不能轻松处理正确的集合。

第三个用于存储有序的数据列表。我遇到过类似的一些应用程序,但很难指出它。当然,您也可以在具有额外列位置的表中表示该位置,但有时这没有多大意义,因为您不需要在数据库中单独访问各个部分。在某些情况下,这只是客户端应用程序稍后要存储和检索的列表。

但你的整体感觉是正确的。如果你不知道更好,你的第一直觉应该是不使用数组。

答案 3 :(得分:1)

IFF数组是一个整体的值,我可能会考虑使用数组数据类型。但什么时候数组只是一个整体的价值?我真的不知道。

可能只有 才能更有意义地搜索整个值。在想要了解相应行之前,有一个应该包含您正在搜索的项目的表似乎没有多大意义。因此,如果您想搜索完整的数组作为密钥。

答案 4 :(得分:0)

integer []适用于转换表。其中键是索引,并且已知每个索引都有一个值,或者有一些代表空位(如-1)。我认为在这种情况下它会比外键更快。

另一种用途是图表。每次测试运行的结果是什么。测试运行有6个结果。是一行,整数[]是6个结果的数组。