列中的不同数据类型

时间:2017-04-04 09:26:44

标签: sql database postgresql

我有一个存储对象属性的表。每个属性在表中都有自己的行,并且它从另一个表中引用对象的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}

1 个答案:

答案 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
         )
);

但是在连接中可能会更难。