我有一个来源(我无法控制它)有一个表,如:
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;
最佳答案
如果该表未规范化,则意味着并非所有这些字段都只依赖主键(id
?).
例如,如果field004
和field005
依赖于field003
,如产品名称和产品描述依赖于产品ID,则从表中删除field004
和field005
,创建一个仅包含这三个字段且以field003
为主键的新表,并建立从主表到该新表的外键关系。
这样,您将得到几个表,每个表都描述特定的实体,以及它们之间的关系。因为避免了冗余数据,所以最终会节省空间并自动保证完整性。
上面的建议与规范化无关。如果表中的大多数字段为空(“稀疏表”),则可能是一种解决方案。
但在这种情况下,使用Joey Pinto的答案建议的JSON解决方案可能会更好。
关于sql - 使用700列以上的规范化PostgreSQL表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44920935/