2017-04-04 12 views
0

オブジェクトのいくつかのプロパティを格納するテーブルがあります。各プロパティはテーブル内に独自の行を持ち、オブジェクトのIDを別のテーブルから参照します。プロパティは現在boolean(0)、numeric(1)、free text(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

'pg_typeof(COLUMN_NAME)' 'ここで私を助ける)私は1列に異なるタイプのデータを格納し、そのデータ型を保持したいので、私は(' pg_typeofを考えていないあなたのタイプ –

+0

を言うだろう。私は私の質問をよりよく記述するためにタイトルを編集しました。 – Nysten

+0

次に、テキストの代わりにjsonデータ型を使用することを検討してください。 –

答えて

1

すべての列には、そう、PostgreSQLで決定したタイプを持っている必要があります異なるタイプを保持できるフィールドを持つことはできません。

JSON値からtextしか取得できないため、JSONを使用するとデータベース内の属性が必要な場合はあまり役に立ちません。あなたは、単一のテーブルをしたい場合、あるいは、

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

を使用しかし、それは参加するには、より難しいかもしれません:

私はそのための3つのテーブル、それぞれのタイプごとに1つを使用します。

関連する問題