2011-09-08 59 views

回答

4

這是PostgreSQL的一個有趣的功能,但是我沒有機會使用它。

有幾件事情浮現在腦海中的Rails的一面:

  1. ActiveRecord的將有一個艱難的時間,格式要查詢這些對象的SQL。您可能必須編寫自定義SQL才能將特殊語法考慮在內。
  2. ActiveRecord將無法執行自定義類型的隱式轉換。嘗試通過ActiveRecord訪問屬性時,這可能會有問題。您可以擴展ActiveRecord的PostgreSQL適配器以將這些特殊數據類型轉換爲自定義類,但這是一種非傳統方法。

有幾件事情浮現在腦海在數據庫方面:

  1. ,因爲這些類型的崩潰多重屬性到一個單一實體的方式,這種方式可能難以查詢。這包括指定您需要檢查特定值的單個屬性的條件。此外,如果這些複合類型中的任何一個包含關鍵引用,則可能難以執行CASCADE選項。
  2. 如果性能成爲問題,此架構方法可能難以索引
  3. 此架構方法似乎沒有以數據庫的方式規範化。在提供的示例中,此複合數據應作爲單獨的表定義存在,並在父表中引用外鍵引用。

除非你想到的具體應用具有令人信服的好處,否則我會建議一種更規範化的方法。相反的:

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

的確。這個解決方案看起來有點冗長,但我猜複合類型在很多情況下都是可以避免的。 –