【问题标题】:Storing searchable Arrays in a SQL-database field在 SQL 数据库字段中存储可搜索的数组
【发布时间】:2019-01-13 04:24:16
【问题描述】:

目前我尝试解决以下问题: 我正在使用的文档管理软件可以为文档定义掩码,每个掩码都有一个或多个索引字段(类型:字符串)。系统支持以下数据库:

  1. Postgres 2.ORACLE 3.Microsoft SQL 4.DB2

现在我应该做一个研究,如果可以将字符串数组存储在 sql 数据库的一个字段中,以便每个掩码只占用 sql 表中的一行。 另一个要求是数组可以通过 sql 搜索。

结果应该是 sql 数据库不像现在那样碎片化,因为每个索引字段都是掩码定义中的一列,而且就性能而言,结果应该相等(或者如果可能更快)。

目前的状态是我有 postgres(但到目前为止只有 Double[] )和 ORACLE(通过 ArrayDouble 类型)的工作示例,结果很好(没有碎片并且性能改进(>200%))。示例是用 java 编写的(标准 jdbc 连接)。

对于 DB2,我找到了一些关于普通数组(和其他两种类型)的文档,但无法构建一个有效的示例,对于 Microsoft SQL,我找不到任何暗示它具有内置数组功能的提示。

所以我的主要问题是你们是否有解决这个问题的经验,并且可以给我建议,特别是关于如何解决这个问题的 DB2 和 Microsoft SQL。此外,如果您有一个很棒的 postgres 和/或 Oracle 解决方案,请与我分享您的知识。 :)

提前致谢 :) 祝大家周一早上愉快 :) 问候帕斯卡

【问题讨论】:

  • 在单列中存储“数组”数据通常意味着您的设计很差。通常,单行中的单列应该代表一件事。如果你有一个多对一或多对多的关系,你应该设计多个表来保存它,而不是一个列来保存一个数组/分隔字符串/等等。
  • "[...] 这样每个掩码只占用 sql 表中的一行" - 为什么?
  • 我的问题是我无法控制设计:/
  • 那是谁呢?他们应该意识到他们所遵循的做法是一个糟糕的设计。我只能从 SQL Server 的角度谈谈,但是,将数据存储在“数组”中(SQL Server 没有数组,因此您必须使用分隔字符串、XML、JSON 或其他东西)几乎总是有性能影响,有些比其他严重得多。如果您可以将设计推向正确的方向,您将处于更好的位置。
  • 我从一个快速的Google 得到这篇文章,它展示了(我称之为)使用复合键表管理多对多关系的传统方法:How to Handle a Many-to-Many Relationship in Database Design

标签: java sql sql-server oracle postgresql


【解决方案1】:

使用 Oracle,您可以使用 NESTED TABLEs(或 VARRAYs)将数组存储在列中:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TYPE String_Table IS TABLE OF VARCHAR2(100)
/

CREATE TABLE test (
  id     NUMBER(10,0),
  col1   VARCHAR2(10),
  array1 String_Table
) NESTED TABLE array1 STORE AS test__array1
/

INSERT INTO test ( id, col1, array1 )
  SELECT 1, 'Row1', String_Table( 'A', 'B', 'C' ) FROM DUAL UNION ALL
  SELECT 2, 'Row2', String_Table( 'C', 'D', 'E' ) FROM DUAL
/

查询1:然后可以使用集合操作如:MEMBER OF在集合中查找项目;和 MULTISET 运算符(如 SUBMULTISET OF)来查找包含另一个集合的所有项目的集合。

SELECT *
FROM   test
WHERE  'B' MEMBER OF array1
OR     String_Table( 'E', 'C' ) SUBMULTISET OF array1

Results

| ID | COL1 | ARRAY1 |
|----|------|--------|
|  1 | Row1 |  A,B,C |
|  2 | Row2 |  C,D,E |

如果您使用 Java,那么您可以将 Java 数组作为 PreparedStatementCallableStatement 的绑定参数传递。这方面的一些例子是herehere

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 2020-12-25
    • 2016-08-03
    • 2017-09-09
    • 1970-01-01
    • 2014-07-11
    • 2017-02-12
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多