我们正在从word文档中提取内容部分,并一直在反复讨论如何存储这些任意数据。我们使用的是PostgreSQL,我们的计划是使用JSON字段保存JSON字段中的任意部分。
理想情况下,我们只想把所有的关系映射成关系,但是数据类型(表格、文本、图像、列表等)有很大的多样性。每个文档中没有一个列是相同的,DocumentA中的同一个部分可以有一个表,而DocumentB中的相同部分可以由文本或图片组成,因此需要将其存储在JSON中。
这就是一个例子:
DocumentA:有一个字段名为
ColA|ColB|ColC
val1|val2|val3
val4|val5|val6
DocumentB:有一个表文档,其字段名为
ColB|ColC|ColD
val1|val2|val3
val4|val5|val6
DocumentC:有一个只有一段文字和一个表格的表格文档
注意:每个文档可以产生多个类型的数据(例如,DocumentA可以有2x表和一个文本数据)。
我们的第一个想法是将它存储在postgreSQL中的单个字段中,作为一个平面的JSON数组。
这将是PostgreSQL中用于(例如INSERT INTO documentData(id,documentName,JSONField) VALUES (1, 'DocumentA', '<JSONDATA>'
) documentA的一行。
[
{
"Content Type":"Table"
"ColA": "val1",
"ColB": "val2",
"ColC": "val3"
},
{
"Content Type":"Table"
"ColA": "val4",
"ColB": "val5",
"ColC": "val6"
}
]
另一个记录INSERT INTO documentData(id,documentName,JSONField) VALUES (2, 'DocumentB', '<JSONDATA>'
[
{
"Content Type":"Table"
"ColB": "val1",
"ColC": "val2",
"ColD": "val3"
},
{
"Content Type":"Table"
"ColB": "val4",
"ColC": "val5",
"ColD": "val6"
}
]
另一个记录INSERT INTO documentData(id,documentName,JSONField) VALUES (3, 'DocumentC', '<JSONDATA>'
[
{
"Content Type":"Text"
"Data": "Random paragraph of text",
},
{
"Content Type": Table",
"ColA": "val1",
"ColE": "val2",
"ColF": "val3"
}
]
我认为这样做的主要问题可能会导致查询数据的困难。还有其他建议吗?
最终目标是提取某些控制文档中的内容。控件文档中有列的表和必须引用的其他文档的部分名称的单元格。将其存储在RTF中将是一个不错的想法,但不确定如何处理搜索和参考可靠的材料。
发布于 2016-04-04 01:38:04
如果您正在寻找JSON以外的替代方法,并且只需要文本名称-值对集合的数组,则只需使用PostgreSQL的数组:
CREATE TYPE mydoc AS (content_type text, names text[], values text[]);
CREATE TABLE documentData(id int primary key, documentName text, docs mydoc[]);
INSERT INTO documentData(id,documentName,docs) VALUES (1, 'DocumentA', '{"(Table,\"{ColA,ColB,ColC}\",\"{val1,val2,val3}\")","(Table,\"{ColA,ColB,ColC}\",\"{val4,val5,val6}\")"}'::mydoc[])
SELECT d.id, d.documentName, dd.*
FROM documentData d
LEFT JOIN LATERAL unnest(d.docs) dd ON (true);
这与JSON相比并没有太大的优势,除了可移植到较早的PostgreSQL版本之外,但是unnest
和=ANY
类型的操作通常比JSON函数简单得多,因此可能更容易查询和操作,例如:
SELECT d.id, d.documentName, dd.content_type, pos, name, dd.values[pos] AS value
FROM documentData d
LEFT JOIN LATERAL unnest(d.docs) dd ON (true)
LEFT JOIN LATERAL unnest(dd.names) WITH ORDINALITY AS y (name, pos) ON (true)
WHERE dd.content_type = 'Table' AND name ~ '^Col[AB]';
https://dba.stackexchange.com/questions/134010
复制相似问题