2017-01-22 10 views
0

1列に別のテーブルからデータを組み合わせることが可能である:は、それは私が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" 
     } 
    } 
] 

トリッキーな部分は、私は値が含まれたくないだけということです1つのタイプの、しかし異なったタイプの。私の考えは値ごとに異なるテーブルなど持っていることでした。

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

これはさまざまな方法で行うことができます。そのうちの1つは、1つのテーブルのみを使用して、value_typenumberの場合はnumeric_valueunitの値を入力する必要があります。それ以外の場合はtexttext_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') ; 
関連する問題