這是PostgreSQL的一個有趣的功能,但是我沒有機會使用它。
有幾件事情浮現在腦海中的Rails的一面:
- ActiveRecord的將有一個艱難的時間,格式要查詢這些對象的SQL。您可能必須編寫自定義SQL才能將特殊語法考慮在內。
- ActiveRecord將無法執行自定義類型的隱式轉換。嘗試通過ActiveRecord訪問屬性時,這可能會有問題。您可以擴展ActiveRecord的PostgreSQL適配器以將這些特殊數據類型轉換爲自定義類,但這是一種非傳統方法。
有幾件事情浮現在腦海在數據庫方面:
- ,因爲這些類型的崩潰多重屬性到一個單一實體的方式,這種方式可能難以查詢。這包括指定您需要檢查特定值的單個屬性的條件。此外,如果這些複合類型中的任何一個包含關鍵引用,則可能難以執行CASCADE選項。
- 如果性能成爲問題,此架構方法可能難以索引
- 此架構方法似乎沒有以數據庫的方式規範化。在提供的示例中,此複合數據應作爲單獨的表定義存在,並在父表中引用外鍵引用。
除非你想到的具體應用具有令人信服的好處,否則我會建議一種更規範化的方法。相反的:
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);
CREATE TABLE on_hand (
item inventory_item,
count integer
);
INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);
您可以通過執行以下操作達到類似的結果,一方面保持ActiveRecord的全力支持,而無需擴展Postgres的適配器,或者創建自定義類:
CREATE TABLE inventory_item (
id integer,
name text,
supplier_id integer,
price numeric
);
CREATE TABLE on_hand (
inventory_item_id integer,
count integer
);
INSERT INTO inventory_item VALUES ('fuzzy dice', 42, 1.99) RETURNS INTEGER;
INSERT INTO on_hand VALUES (<inventory_item_id>, 1000);
的確。這個解決方案看起來有點冗長,但我猜複合類型在很多情況下都是可以避免的。 –