PostgreSQL – 整数最佳实践

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

正如Milen A. Radev指出:

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

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

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

最后,我很困惑的是整数[]最好用于什么语境?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

也许什么时候搜索整个价值更有意义。 在您想知道相应的行之前,有一个应该包含您正在搜索的项目的表似乎没有多大意义。 所以如果你想搜索完整的数组作为关键。

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

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