关系数据库数组(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)的主要内容,如果未能解决你的问题,请参考以下文章
H2 数据库 - Java 的 OffsetDateTime 和 h2 类型之间的映射
SpringBoot实战之使用JDBC和Spring访问数据库