我有一个存储对象属性的表。每个属性在表中都有自己的行,并且它从另一个表中引用对象的id。属性当前是boolean(0),numeric(1)或自由文本(2)类型,它们存储单个值。
问题是,如何确定哪一行属于哪种类型?属性表是否应该有一个名为type
的列,然后将该值存储在单独的TEXT
列中,或者可能将该值存储为JSON对象?有一个好的解决方案吗?我相信我的担心是保留数据类型,如果数据存储在TEXT
列中,这可能很难处理。
我的直觉告诉我,将类型和值存储在JSON对象中将是这里的方法。
对象表:
id | name
-----+-----
123 | abc
财产表的想法:
id | object_id | type | data
----+-----------+------+-------
1 | 123 | 1 | 123.12
2 | 123 | 0 | f
属性表的其他想法:
id | object_id | type | data
----+-----------+-----------------------
1 | 112 | 1 | {value:123.12}
2 | 112 | 0 | {value:false}
答案 0 :(得分:1)
每列必须在PostgreSQL中具有确定的类型,因此您不能拥有可以包含不同类型的字段。
如果您需要数据库中的属性,使用JSON将无济于事,因为您只能从JSON值中获取text
。
我会使用三个表,每个类型一个:
CREATE TABLE bool_property (
id integer PRIMARY KEY,
object_id integer NOT NULL REFERENCES object(id),
data boolean NOT NULL
);
CREATE TABLE num_property (
id integer PRIMARY KEY,
object_id integer NOT NULL REFERENCES object(id),
data numeric NOT NULL
);
CREATE TABLE text_property (
id integer PRIMARY KEY,
object_id integer NOT NULL REFERENCES object(id),
data text NOT NULL
);
或者,如果您想要一张表,请使用
CREATE TABLE property (
id integer PRIMARY KEY,
object_id integer NOT NULL REFERENCES object(id),
datatype regtype NOT NULL,
bool_data boolean,
num_data numeric,
text_data text,
CHECK (CASE datatype
WHEN 'boolean'::regtype
THEN bool_data IS NOT NULL
AND num_data IS NULL
AND text_data IS NULL
WHEN 'numeric'::regtype
THEN bool_data IS NULL
AND num_data IS NOT NULL
AND text_data IS NULL
WHEN 'text'::regtype
THEN bool_data IS NULL
AND num_data IS NULL
AND text_data IS NOT NULL
ELSE FALSE
END
)
);
但是在连接中可能会更难。