2014-02-26 128 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

这是最好的总结。 –