我有一个来源(我无法控制),表格如下:
CREATE TABLE temp.badtable(
Id INTEGER
,Meta TEXT
,Field001 FLOAT
,Field002 FLOAT
,...
,Field720 FLOAT
);
字段名称可预测且类型是同类的。我想在处理数据之前规范化该表。我希望有一个形状良好的表,它应该看起来像:
CREATE TABLE temp.goodtable(
Id INTEGER
--,Meta TEXT -- For normalization sake
,FieldName TEXT
,FieldValue FLOAT
);
使用PostgreSQL有没有正确的方法?
更新
我使用JSON获得了一个解决方案。这不是执行,但它实现了我的需要:
WITH
A AS (
SELECT
Id
,row_to_json(M) AS Data
FROM
temp.badtable
),
B AS (
SELECT
Id
,row_to_json(json_each(Data)) AS Pair
FROM
A
)
SELECT
Id
,Pair->>'key' AS FieldKey
,Pair->>'value' AS FieldValue
FROM B;
答案 0 :(得分:1)
如果该表未规范化,那意味着并非所有这些字段都只依赖于主键(id
?)。
例如field004
和field005
取决于field003
,产品名称和产品说明取决于产品ID,您可以删除field004
和{ {1}}从表中创建一个新表,其中只包含这三个以field005
为主键的字段,并建立从主表到此新表的外键关系。
通过这种方式,您最终会得到几个表,每个表都描述某些实体,并且它们之间存在关系。您最终会节省空间并自动保证完整性,因为您可以避免冗余数据。
您在上面提出的建议与标准化无关。如果表中的大多数字段为NULL(“稀疏表”),则可能是一种可能的解决方案。
但在这种情况下,使用JSON的解决方案可能会更好,例如Joey Pinto的回答建议。
答案 1 :(得分:0)
考虑在PostgreSQL中使用JSON []。