我正在尝试使用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,如果我采取完全错误的方法来解决这个问题。
答案 0 :(得分:0)
您可以通过不同方式执行此操作。其中一个是仅使用一个表,并以这样的方式定义,当value_type
为number
时,您被迫填写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') ;