Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PostgreSQL-整数[]最佳实践_Java_Sql_Postgresql_Jdbc_Ibatis - Fatal编程技术网

Java PostgreSQL-整数[]最佳实践

Java PostgreSQL-整数[]最佳实践,java,sql,postgresql,jdbc,ibatis,Java,Sql,Postgresql,Jdbc,Ibatis,最近我在开发一个web应用程序时,决定在数据模型中使用integer[]。有两个表,一个带有项目数据,另一个带有标记(标记id和描述),决定在article.tags integer[]列中为项目标记标记标记id 正如所指出的那样: 提示:数组不是集合;搜索特定数组元素可能是数据库设计错误的标志。考虑为每个项目使用一个单独的表,这将是一个数组元素。这将更容易搜索,并且对于大量元素可能具有更好的扩展性 不仅如此,还必须使用JDBC和iBatis来处理integer[],我应该说“有趣” 就目前而言

最近我在开发一个web应用程序时,决定在数据模型中使用integer[]。有两个表,一个带有项目数据,另一个带有标记(标记id和描述),决定在article.tags integer[]列中为项目标记标记标记id

正如所指出的那样:

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

不仅如此,还必须使用JDBC和iBatis来处理integer[],我应该说“有趣”

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

最后,我对integer[]的最佳用途和上下文感到困惑


我想我已经想通了这不是最好的

IMHO,因为任何数组都违反1NF,所以最好的上下文是:。。。(鼓声)。。。。。没有

这就引出了一个问题:为什么我们会有不需要查询的数据。所有的值都可能是可搜索的,如果我们不应该在可搜索的值上使用数组,我们会再次得出结论,它永远不值得使用

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


编辑:上面我说,“我肯定这些存在…”看看@mu的答案,举个例子。

整数[]对于转换表来说是很好的。其中,键是索引,每个索引都有一个值,或者有某种方式表示空位置(如-1)。我认为在这种情况下,它将比外键更快


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

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

第一个是非规范化。权衡包括:您不能轻松地单独更新或处理元素。但是一次把它们全部取出来很容易也很快。它还节省了很多空间

第二个稍微相关的是,您使用阵列不是为了存储,而是为了一些中间处理。例如,如果您希望使用不容易处理正确集合的非SQL ish语言成批处理数据

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


但你的总体感觉是对的。如果你不知道,你的第一本能可能不应该使用数组。

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


也许当搜索整个价值时才更有意义。在您想要知道对应的行之前,有一个应该包含您正在搜索的项目的表似乎没有多大意义。因此,如果您想搜索完整的数组作为键。

我在处理树结构(如注释线程)时使用了PostgreSQL中的数组。可以将从根到节点的路径存储为分支编号数组。然后,按正确的显示顺序拉出整棵树只需执行以下操作:

SELECT stuff
FROM comments
WHERE thread = X
ORDER BY path -- This would be the array.
PostgreSQL以唯一明智的方式比较数组。使用一个数组作为根的路径,还可以方便地计算节点的深度。为了同样的目的,可以使用字符串(比如说,每个分支编号有3个基数为96的数字)和ASCII Betial排序,但数组要清晰得多

是的,还有其他处理树的方法,这些方法更迂腐,但使用数组提供了一个非常清晰的实现。如果我在做大量的树操作,那么维护路径数组将涉及大量繁忙的工作,因此我可能会使用不同的表示


不完全是Java特有的,但在某些情况下,数组是手头数据的自然而有用的表示形式(甚至在SQL中也是如此)。

极好的例子。