- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们在 rational db(表)中有用于测量特征的列:A、B、C、D、...、Z。它们每个都有 3 列:名称、值、错误。样本是行,一个样本的每个特征都有一个或零个测量值。 A 和 B 列的数据已填充 90%,但 C、D、...、Z 非常罕见 - 稀疏列(大约 10% 的单元格在每个单元格中均不包含空值)。
使用 JSON 在 PostgreSQL 中存储这些数据的最佳方式是什么?
我的变体(新表有两列:序列号和 JSON)
将示例的 JSON 数组存储在一个单元格中(一个原始行匹配一个新行)。
将示例的 JSON 数组拆分为多行(一行中有一个数组元素;因此,一个原始行与几个新行匹配)。
使用有理数列:)
示例:2 个原始行提供这些 JSON 字符串:
----------row 1----------
[
{
"name" : "A",
"value" : 3.300000,
"err" : 1.200000,
},
{
"name" : "B",
"value" : 730.000000,
"err" : 112.000000,
},
{
"name" : "E",
"value" : 22.600000,
"err" : 4.700000,
},
{
"name" : "H",
"value" : 58.300000,
"err" : 11.100000,
}
]
----------row 2----------
[
{
"name" : "A",
"value" : 2.100000,
"err" : 1.400000,
},
{
"name" : "J",
"value" : 266.000000,
"err" : 65.000000,
},
{
"name" : "K",
"value" : 14.700000,
"err" : 3.800000,
}
]
我应该使用哪个?
如果我有示例中提到的带有记录的文本文件(原始表的每一行的 JSON 数组),如何将此数据集导入 PostgreSQL?
最佳答案
首先使用 COPY
以纯文本形式导入数据,以防它不是有效的 JSON 格式(这里就是这种情况)。您可以使用 pattern matching对于一些基本的清理,然后用一个简单的 type cast 解析它.如果文件不容易从数据库访问,您可以查看 psql \copy
以及它的 PGAdmin wrapper
create table public.measurement_samples_raw (sample_row text);
/* /home/username/measurement_samples.json:
[{"name":"A","value":3.300000,"err":1.200000,},{"name":"B","value":730.000000,"err":112.000000,},{"name":"E","value":22.600000,"err":4.700000,},{"name":"H","value":58.300000,"err":11.100000,}]
[{"name":"A","value":2.100000,"err":1.400000,},{"name":"J","value":266.000000,"err":65.000000,},{"name":"K","value":14.700000,"err":3.800000,}] */
copy public.measurement_samples_raw (sample_row)
from '/home/your_username/measurement_samples.json';
update public.measurement_samples_raw set
sample_row = regexp_replace(
'{"top_key":'||sample_row||'}', --unnamed lists aren't supported, so adding a key and wrapping in {...}
',\s*}', '}',--pattern and replacement to remove trailing commas
'g' --forces the function to replace all instances of the pattern
);
alter table public.measurement_samples_raw
add column sample_id serial,--so that each measurement sample has an ID
add column sample_row_jsonb jsonb;
update public.measurement_samples_raw
set sample_row_jsonb=sample_row::jsonb;
您可以规范化结构并通过使用 json type functions and operators 提取来填充它
drop table if exists public.measurement_samples;
create table public.measurement_samples (
id serial,
name char(1),
value numeric,
err numeric,
constraint measurement_samples_pk primary key (id, name) --I assume you don't want >=2 values for characteristic 'A' in a single measurement row
);
insert into public.measurement_samples (id, name, value, err)
select sample_id,
(single_measurement_in_sample->>'name')::text,
(single_measurement_in_sample->>'value')::numeric,
(single_measurement_in_sample->>'err')::numeric
from (
select sample_id,
json_array_elements(
sample_row::json->'top_key'
) as single_measurement_in_sample
from public.measurement_samples_raw
) raw_input;
这给了你一个无缝的结构:
table public.measurement_samples;
-- id | name | value | err
------+------+------------+------------
-- 1 | A | 3.300000 | 1.200000
-- 1 | B | 730.000000 | 112.000000
-- 1 | E | 22.600000 | 4.700000
-- 1 | H | 58.300000 | 11.100000
-- 2 | A | 2.100000 | 1.400000
-- 2 | J | 266.000000 | 65.000000
-- 2 | K | 14.700000 | 3.800000
--(7 rows)
您可以根据您的需要重新排列,而不会浪费空间,但会牺牲性能 - 除非您创建 View materialized :
create view public.v_measurement_samples as
select id,
sum(value) filter (where name='A') as "A_value",
sum(err) filter (where name='A') as "A_err",
sum(value) filter (where name='B') as "B_value",
sum(err) filter (where name='B') as "B_err",
sum(value) filter (where name='C') as "C_value",
sum(err) filter (where name='C') as "C_err",
sum(value) filter (where name='D') as "D_value",
sum(err) filter (where name='D') as "D_err",
sum(value) filter (where name='E') as "E_value",
sum(err) filter (where name='E') as "E_err"
from public.measurement_samples
group by id
order by id;
--table public.v_measurement_samples;
-- id | A_value | A_err | B_value | B_err | C_value | C_err | D_value | D_err | E_value | E_err
------+----------+----------+------------+------------+---------+-------+---------+-------+-----------+----------
-- 1 | 3.300000 | 1.200000 | 730.000000 | 112.000000 | | | | | 22.600000 | 4.700000
-- 2 | 2.100000 | 1.400000 | | | | | | | |
--(2 rows)
工作 dbfiddle示例。
关于json - 如何用 JSON 表示 PostgreSQL 中的稀疏 RDBS 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51916577/
最近开始学习MongoDB。今天老师教了我们 mongoexport 命令。在练习时,我遇到了一个典型的问题,包括教练在内的其他同学都没有遇到过。我在我的 Windows 10 机器上使用 Mongo
我是 JSON Schema 的新手,读过什么是 JSON Schema 等等。但我不知道如何将 JSON Schema 链接到 JSON 以针对该 JSON Schema 进行验证。谁能解释一下?
在 xml 中,我可以在另一个 xml 文件中包含一个文件并使用它。如果您的软件从 xml 获取配置文件但没有任何方法来分离配置,如 apache/ngnix(nginx.conf - site-av
我有一个 JSON 对象,其中包含一个本身是 JSON 对象的字符串。我如何反序列化它? 我希望能够做类似的事情: #[derive(Deserialize)] struct B { c: S
考虑以下 JSON { "a": "{\"b\": 12, \"c\": \"test\"}" } 我想定义一个泛型读取 Reads[Outer[T]]对于这种序列化的 Json import
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 11 个月前关闭。 Improve
我的旧项目在 MySQL 中有 Standard JSON 格式的数据。 对于我在 JS (Node.js) 和 DynamoDB 中的全新项目,关于 Standard JSON格式: 是否建议将其转
JSON 值字符串、数字、true、false、null 是否是有效的 JSON? 即,是 true 一个有效的 JSON 文档?还是必须是数组/对象? 一些验证器接受这个(例如 http://jso
我有一个 JSON 字符串,其中一个字段是文本字段。这个文本字段可以包含用户在 UI 中输入的文本,如果他们输入的文本是 JSON 文本,也许是为了说明一些编码,我需要对他们的文本进行编码,以便它不会
我正在通过 IBM MQ 调用处理数据,当由 ColdFusion 10 (10,0,11,285437) 序列化时,0 将作为 +0.0 返回,它会导致无效的 JSON并且无法反序列化。 stPol
我正在从三个数组中生成一个散列,然后尝试构建一个 json。我通过 json object has array 成功了。 require 'json' A = [['A1', 'A2', 'A3'],
我从 API 接收 JSON,响应可以是 30 种类型之一。每种类型都有一组唯一的字段,但所有响应都有一个字段 type 说明它是哪种类型。 我的方法是使用serde .我为每种响应类型创建一个结构并
我正在下载一个 JSON 文件,我已将其检查为带有“https://jsonlint.com”的有效 JSON 到文档目录。然后我打开文件并再次检查,结果显示为无效的 JSON。这怎么可能????这是
我正在尝试根据从 API 接收到的数据动态创建一个 JSON 对象。 收到的示例数据:将数据解码到下面给出的 CiItems 结构中 { "class_name": "test", "
我想从字符串转换为对象。 来自 {"key1": "{\n \"key2\": \"value2\",\n \"key3\": {\n \"key4\": \"value4\"\n }\n
目前我正在使用以下代码将嵌套的 json 转换为扁平化的 json: import ( "fmt" "github.com/nytlabs/gojsonexplode" ) func
我有一个使用来自第三方 API 的数据的应用程序。我需要将 json 解码为一个结构,这需要该结构具有“传入”json 字段的 json 标签。传出的 json 字段具有不同的命名约定,因此我需要不同
我想使用 JSON 架构来验证某些值。我有两个对象,称它们为 trackedItems 和 trackedItemGroups。 trackedItemGroups 是组名称和 trackedItem
考虑以下案例类模式, case class Y (a: String, b: String) case class X (dummy: String, b: Y) 字段b是可选的,我的一些数据集没有字
我正在存储 cat ~/path/to/file/blah | 的输出jq tojson 在一个变量中,稍后在带有 JSON 内容的 curl POST 中使用。它运作良好,但它删除了所有换行符。我知
我是一名优秀的程序员,十分优秀!