关系数据库数组(H2、Java)

Posted

技术标签:

【中文标题】关系数据库数组(H2、Java)【英文标题】:Relational Database arrays (H2, Java) 【发布时间】:2011-02-04 19:03:30 【问题描述】:

关于如何实现数组,我似乎有两种选择,我想知道我应该选择哪一种:

使用 ARRAY 数据类型并(据我了解)有效地将数据对象序列化到数据库中(在我的情况下,它们只是包装的原始类型;不知道另一种方法可以使这项工作)。

为每个数组项使用单独的表和外键映射。

如果您有这方面的经验(尤其是 H2),您会推荐哪个?

【问题讨论】:

【参考方案1】:

数组字段在数据库中通常是禁忌,它经常违反规范化原则。根据数据的用途,您需要将它们存储在与父表具有 fk 关系的单独表中,或者存储在独立表中(当单个项目可能多次出现时更好,即 n-m 关系代替n-0) 并使用 fk-fk 连接表来处理它们与父表之间的关系。

在 SQL/JDBC 中,您通常可以将它们作为数组SELECT,具体取决于数据库是否支持 SQL 构造/函数。例如,在 PostgreSQL 中,您可以为此使用 ARRAY() 函数,您可以在 Java/JDBC 中使用 ResultSet#getArray() 获得该函数。

【讨论】:

是的,我想我不想开始重新编码数据库函数,所以我将按照您的规范化建议并将其映射到一个表。无论如何,我什至不知道用我自己的代码处理数组是否真的有任何改进。 H2 实际上确实支持数组。如果可能的话,我也会避免使用它,但只是为了让你知道。 @Thomas:是的,几乎所有自尊的数据库都支持 SQL ARRAY 类型。然而,在现实世界中,这几乎适用于任何违反规范化原则的用例。 @Thomas 和@BalusC:不一定是坏事。如果您拥有像 postgres 一样强大的数组,那么如果使用得当(例如与存储函数一起使用),那么您将拥有一个很棒的工具

以上是关于关系数据库数组(H2、Java)的主要内容,如果未能解决你的问题,请参考以下文章

access数据库和h2数据库的关系

H2 数据库 - Java 的 OffsetDateTime 和 h2 类型之间的映射

如何在java中设计JPA多态关系?

SpringBoot实战之使用JDBC和Spring访问数据库

SpringBoot实战之使用JDBC和Spring访问数据库

Java数据结构(线性表)--线性表 & 线性表和数组的关系