目前,我尝试解决以下问题: 我正在使用的文档管理软件可以为那里的文档定义掩码,每个掩码都有一个或多个索引字段(类型:字符串)。系统支持以下数据库:
现在,如果可以将字符串数组仅存储在sql数据库的一个字段中,以便每个掩码仅占用sql表中的一行,那么我应该进行研究。 另一个要求是可以通过sql搜索该数组。
结果应该是sql数据库不像现在这样分散,因为每个索引字段都是掩码定义中的一列,而且在性能方面,结果应该相等(或者可能更快)。
当前状态是,我有一些postgres(但到目前为止仅使用Double [])和ORACLE(通过ArrayDouble类型)的工作示例,结果很好(没有碎片并且性能得到了提高(> 200%))。这些示例使用Java(标准jdbc连接)编写。
对于DB2,我找到了一些有关普通数组(和其他两种类型)的文档,但是无法构建有效的示例,对于Microsoft SQL,我找不到任何暗示它内置了数组功能的提示。
所以我的主要问题是,你们是否有解决此问题的经验,并且可以就如何解决此问题特别向我提供有关DB2和Microsoft SQL的建议。另外,如果您对Postgres和/或Oracle有很棒的解决方案,请与我分享您的知识。 :)
在此先感谢您:)祝大家星期一星期一愉快:) 问候帕斯卡
答案 0 :(得分:1)
使用Oracle,您可以使用NESTED TABLE
s(或VARRAY
s)将数组存储在列中:
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数组作为PreparedStatement
或CallableStatement
的绑定参数进行传递。 here和here这样的例子。