我有一个来源(我无法控制它)有一个表,如:

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?).
例如,如果field004field005依赖于field003,如产品名称和产品描述依赖于产品ID,则从表中删除field004field005,创建一个仅包含这三个字段且以field003为主键的新表,并建立从主表到该新表的外键关系。
这样,您将得到几个表,每个表都描述特定的实体,以及它们之间的关系。因为避免了冗余数据,所以最终会节省空间并自动保证完整性。
上面的建议与规范化无关。如果表中的大多数字段为空(“稀疏表”),则可能是一种解决方案。
但在这种情况下,使用Joey Pinto的答案建议的JSON解决方案可能会更好。

关于sql - 使用700列以上的规范化PostgreSQL表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44920935/

10-12 22:10