2017-04-04 68 views
0

我有一個存儲對象屬性的表。每個屬性在表中都有它自己的行,並且它引用另一個表中的對象ID。屬性目前是布爾類型(0),數字(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

'pg_typeof(column_name)'會告訴你類型 –

+0

我想在單個列中存儲不同類型的數據並保留它們的數據類型,所以我不認爲'pg_typeof()'會幫助我。我編輯了標題以更好地描述我的問題。 – Nysten

+0

然後考慮使用json數據類型而不是文本 –

回答

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

但可能是比較困難的連接。