Sql 列中的不同数据类型
我有一个存储对象某些属性的表。每个属性在表中都有自己的行,并且从另一个表中引用对象的id。属性当前的类型为布尔(0)、数字(1)或自由文本(2),它们存储单个值 问题是,如何确定哪一行属于哪一种类型?属性表是否应该有一个名为Sql 列中的不同数据类型,sql,database,postgresql,Sql,Database,Postgresql,我有一个存储对象某些属性的表。每个属性在表中都有自己的行,并且从另一个表中引用对象的id。属性当前的类型为布尔(0)、数字(1)或自由文本(2),它们存储单个值 问题是,如何确定哪一行属于哪一种类型?属性表是否应该有一个名为type的列,然后将该值存储在单独的TEXT列中,或者可能将该值存储为JSON对象?有没有一个好的解决办法?我相信我在这里担心的是保存数据类型,如果数据存储在TEXT列中,则很难处理数据类型 我的直觉告诉我,在JSON对象中存储类型和值将是一种方法 对象表: id | n
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}
属性表的其他想法:
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}
在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
)
);
但是在连接中,这可能更困难。
pg\u typeof(column\u name)
会告诉您类型我想在一列中存储不同类型的数据并保留它们的数据类型,因此我认为pg\u typeof()
在这里对我没有帮助。我编辑了标题来更好地描述我的问题。然后考虑使用JSON DATAYPE而不是TeXY,您通过使用它作为EAV模型来滥用RDBMS。你真的不应该。您使用的是postgres,那么为什么不使用它的文档存储和jsonb呢?如果要对数据
列使用json
(或jsonb
),则不需要类型
列。您也不需要将值包装到JSON对象,到_JSON[b](1)
,到_JSON[b](FALSE)
,到_JSON[b]('string')
是完全有效的,您甚至可以使用(9.4+)获得JSON值的类型。