的任意行和現場是否有任何形式的(數據類型,內在..)的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層面上做同樣的事情。
問題更新 –
所以,你有一種鍵/值或類似EAV的映射,並希望有值的FK引用各種不同的表? –
這是最好的總結。 –