最近在Web应用上工作我决定在数据模型中使用integer []。有2个表,一个有文章数据,第二个有标签(标签ID和描述),决定标签ID,文章将在article.tags integer []列中标记。
正如Milen A. Radev所指出的那样:
提示:数组不是集合;搜索特定的数组元素可能是数据库错误设计的标志。考虑为每个将成为数组元素的项使用一个单独的表。这将更容易搜索,并且可能更好地扩展到大量元素。
不仅如此,但是必须使用JDBC和iBatis来处理整数[],我应该说“有趣”。
目前,我可以完成我必须做的工作实施。为了简单起见,它可能会使用一个存储article.id和tag.id关系的单独表来重新工作。
最后,我对最好用于什么语境的整数[]感到困惑?
我想我已经找到了最好的方法。
答案 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个结果的数组。