2017-01-22 20 views
0

我想達到以下JSON結構與SQL-架構相結合:是否有可能將數據從不同的表中的一列

"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} 

我的問題是,我不知道如何引用IDS從一列中的不同表格中使用密鑰,如果我在處理這個問題時採取了完全錯誤的方法。

回答

0

你可以用不同的方式做到這一點。其中之一就是隻使用一個表格,並將其定義爲當您的value_typenumber時,您不得不填寫numeric_valueunit(而不是其他任何值)的值,並且當它是text時,您必須再填寫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') ; 

這些的人不會:

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') ; 
相關問題