PostgreSQL - 整数[]最佳实践

vec*_*tor 2 java sql postgresql ibatis jdbc

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

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

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

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

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

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

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

Pet*_*aut 5

我可以想到三个应用:

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

第二个稍微相关的是,您使用数组不是为了存储,而是为了一些中间处理。例如,如果您想要使用非 SQL 语言批量处理数据,而该语言无法轻松处理正确的集合。

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

但你的总体感觉是对的。如果您不太了解,您的第一直觉可能应该是不要使用数组。


mu *_*ort 5

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

SELECT stuff
FROM comments
WHERE thread = X
ORDER BY path -- This would be the array.
Run Code Online (Sandbox Code Playgroud)

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

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

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