2014-02-26 180 views
0

的任意行和現場是否有任何形式的(數據類型,內在..)的PostgreSQL中是這樣實現:參考在另一個表

CREATE TABLE log (
    datareferenced table_row_column_reference, 
    logged boolean 
); 

引用的數據可能與數據庫中的任何行字段。我的目標是在不使用過程語言的情況下實現類似的東西,或者在更高層中實現它,只使用關係方法而不修改其餘表格。另一個功能可能是引用完整性,例如:

-- Table foo (id, field1,  field2, fieldn) 
--   ('bar', '2014-01-01', 4.33, Null) 

-- Table log (datareferenced,        logged) 
--   ({table foo -> id:'bar' -> field2 } <=> 4.33, True) 

DELETE FROM foo where id='bar'; 
-- as result, on cascade, deleted both rows. 

我有一個應用程序生成到MVC模式。邏輯是用Python編寫的。該應用程序是一個管理工具,數據密集型。我的目標是實現一個模塊,可以存儲DDBB中每個數據的附加信息。舉例來說,客戶端擁有一系列屬性(名稱,地址,電話,電子郵件等),並且我希望應用程序可以存儲元數據 - 就像所有DDBB中的每個註冊表一樣。元數據可能是最後一次修改,或用戶標誌等。

我已經實現了元數據模型(在postgres中),其映射到對象和parcial API。但剩下的部分是最重要的,膠水。我的計劃B是將數據映射層中的膠水作爲模塊創建的。事情是這樣的:

address= person.addresses[0] 
address.saveMetadata('foo', 'bar') 

-- in the superclass of Address 
def saveMetadata(self, code, value): 
    self.mapper.metadata_adapter.save(self, code, value) 

-- in the metadata adapter class: 
def save(self, entity, code, value): 
    sql = """update value=%s from metadata_values 
      where code=%s and idmetadata= 
         (select id from metadata_rels mr 
         where mr.schema=%s and mr.table=%s and 
         mr.field=%s and mr.recordpk=%s)"""%   
         (value, code, 
         self.class2data[entity.__class__]["schema"], 
         self.class2data[entity.__class__]["table"], 
         self.class2data[entity.__class__]["field"], 
         entity.id) 

    self.mapper.execute(sql) 

def read(self, entity , code): 
    sql = """select mv.value 
      from metadata_values mv 
      join metadata_rels mr on mv.idmetadata=mr.id 
      where mv.code=%s and mr.schema=%s and mr.table=%s and 
        mr.field=%s and mr.recordpk=%s"""%   
        (code, 
        self.class2data[entity.__class__]["schema"], 
        self.class2data[entity.__class__]["table"], 
        self.class2data[entity.__class__]["field"], 
        entity.id) 

    return self.mapper.execute(sql) 

但它會增加開銷蟒蛇和PostgreSQL之間,複雜的Python邏輯,以及使用PL和觸發器可能是非常費力且容易出錯。這就是爲什麼我要在DDBB層面上做同樣的事情。

回答

1

不,在PostgreSQL中沒有這樣的東西。

您可以自己構建觸發器來執行此操作,可能使用複合類型。但是你說過(出於某種原因)你不想使用PL/PgSQL,所以你已經排除了。但是,獲取RI觸發器非常困難,並且必須將觸發器應用於引用的參考端

坦率地說,這好像是一個方形釘,圓孔樣的問題。你確定PostgreSQL是這個應用程序的正確選擇嗎?

描述你的需求和目標的上下文。你爲什麼要這樣?你想解決什麼問題?也許有更好的辦法可以一步步回到同樣的問題...

+0

問題更新 –

+0

所以,你有一種鍵/值或類似EAV的映射,並希望有值的FK引用各種不同的表? –

+0

這是最好的總結。 –