使用超过700列

时间:2017-07-05 08:33:16

标签: sql postgresql normalization database-normalization

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

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;

2 个答案:

答案 0 :(得分:1)

如果该表未规范化,那意味着并非所有这些字段都只依赖于主键(id?)。

例如field004field005取决于field003,产品名称和产品说明取决于产品ID,您可以删除field004和{ {1}}从表中创建一个新表,其中只包含这三个以field005为主键的字段,并建立从主表到此新表的外键关系。

通过这种方式,您最终会得到几个表,每个表都描述某些实体,并且它们之间存在关系。您最终会节省空间并自动保证完整性,因为您可以避免冗余数据。

您在上面提出的建议与标准化无关。如果表中的大多数字段为NULL(“稀疏表”),则可能是一种可能的解决方案。

但在这种情况下,使用JSON的解决方案可能会更好,例如Joey Pinto的回答建议。

答案 1 :(得分:0)

考虑在PostgreSQL中使用JSON []。