首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结构,用于在PostgreSQL JSON字段中存储表数据、列表、文本、图片。

结构,用于在PostgreSQL JSON字段中存储表数据、列表、文本、图片。
EN

Database Administration用户
提问于 2016-03-31 22:37:44
回答 1查看 833关注 0票数 1

我们正在从word文档中提取内容部分,并一直在反复讨论如何存储这些任意数据。我们使用的是PostgreSQL,我们的计划是使用JSON字段保存JSON字段中的任意部分。

理想情况下,我们只想把所有的关系映射成关系,但是数据类型(表格、文本、图像、列表等)有很大的多样性。每个文档中没有一个列是相同的,DocumentA中的同一个部分可以有一个表,而DocumentB中的相同部分可以由文本或图片组成,因此需要将其存储在JSON中。

这就是一个例子:

DocumentA:有一个字段名为

代码语言:javascript
运行
复制
ColA|ColB|ColC
val1|val2|val3
val4|val5|val6

DocumentB:有一个表文档,其字段名为

代码语言:javascript
运行
复制
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的一行。

代码语言:javascript
运行
复制
[
 {
  "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>'

代码语言:javascript
运行
复制
[
 {
  "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>'

代码语言:javascript
运行
复制
[
 {
  "Content Type":"Text"
  "Data": "Random paragraph of text",
 },
 {
  "Content Type": Table",
  "ColA": "val1",
  "ColE": "val2",
  "ColF": "val3"
 }
]

我认为这样做的主要问题可能会导致查询数据的困难。还有其他建议吗?

最终目标是提取某些控制文档中的内容。控件文档中有列的表和必须引用的其他文档的部分名称的单元格。将其存储在RTF中将是一个不错的想法,但不确定如何处理搜索和参考可靠的材料。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2016-04-04 01:38:04

如果您正在寻找JSON以外的替代方法,并且只需要文本名称-值对集合的数组,则只需使用PostgreSQL的数组:

代码语言:javascript
运行
复制
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函数简单得多,因此可能更容易查询和操作,例如:

代码语言:javascript
运行
复制
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]';
票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/134010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档