是否可以在一列

时间:2017-01-22 17:31:37

标签: sql postgresql rdbms postgresql-9.6

我正在尝试使用SQL-Schema实现以下JSON结构:

"data_set": [
    {
    "id": 0,
    "annotation": "foo",
    "value": 
        {
        "type": "number",
        "value": 10.0,
        "unit": "m"
        }  
    },
    {
    "id": 1,
    "annotation": "bar",
    "value": 
        {
        "type": "text",
        "value": "Hello World"
        }  
    }
]

棘手的部分是我不仅要包含一种类型的值,还要包含不同类型的值。我的想法是为每个值设置不同的表格,例如:

numeric_value: id {PK} | type | value | unit

text_values: id {PK} | type | value

并通过外键将它们包含在data_set表中:

data_set: id {PK} | annotation | value {FK}

我的问题是我不知道如何使用密钥在一列中的不同表中引用id,如果我采取完全错误的方法来解决这个问题。

1 个答案:

答案 0 :(得分:0)

您可以通过不同方式执行此操作。其中一个是仅使用一个表,并以这样的方式定义,当value_typenumber时,您被迫填写numeric_value和{{的值1}}(以及其他内容),当它为unit时,您必须填写text列(填写其余内容,但保留NULL) 。

这个定义可以做到:

text_value

以下插入有效:

CREATE TABLE data_set
(
    data_set_id integer PRIMARY KEY,
    annotation text,
    value_type text NOT NULL,
    numeric_value numeric,
    unit text,
    text_value text,

    /* Constraint to make sure values are consistent with definition */
    CHECK (CASE WHEN value_type = 'text' THEN 
              numeric_value IS     NULL AND unit IS     NULL AND text_value IS NOT NULL 
           WHEN      value_type = 'number' THEN 
              numeric_value IS NOT NULL AND unit IS NOT NULL AND text_value IS     NULL
           ELSE 
              false
           END)
) ;

这些不会:

INSERT INTO 
    data_set 
    (data_set_id, annotation, value_type, numeric_value, unit)
VALUES
    (1, 'height', 'number', 10.0, 'm') ;

INSERT INTO 
    data_set 
    (data_set_id, annotation, value_type, text_value)
VALUES
    (2, 'brand', 'text', 'BigBrand') ;