0

我正在尝试使用 SQL 架构实现以下 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,如果我在解决这个问题时采取了完全错误的方法。

4

1 回答 1

0

你可以用不同的方式做到这一点。其中之一是只使用一个表,并以这样的方式定义它,当你value_type是时number你被迫填写numeric_valueand的值unit(而不是别的),当它是时text,你必须然后填写text_value列(而不填写其余部分,但保留 NULL)。

这个定义可以做到:

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') ;

这些不会:

INSERT INTO 
    data_set 
    (data_set_id, annotation, value_type, text_value)
VALUES
    (3, 'brand', 'strange_type', 'misstake') ;

INSERT INTO 
    data_set 
    (data_set_id, annotation, value_type, text_value)
VALUES
    (4, 'brand', 'number', 'misstake') ;
于 2017-01-22T17:54:58.053 回答