引用另一个表中的任意行和字段

时间:2014-02-26 16:43:55

标签: sql postgresql

在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)

但是它会增加python和postgresql之间的开销,使Python逻辑复杂化,并且使用PL和触发器可能非常费力且容易出错。这就是为什么我在DDBB级别上做同样的事情。

1 个答案:

答案 0 :(得分:1)

不,在PostgreSQL中没有类似的东西。

您可以自己构建触发器,可能使用复合类型。但是你说(出于某种原因)你不想使用PL / PgSQL,所以你已经排除了这一点。但是,获得正确的RI触发器非常困难,并且必须对引用引用的结束应用触发器。

坦率地说,这似乎是一个方形钉,圆孔问题。你确定PostgreSQL是这个应用程序的正确选择吗?

在上下文中描述您的需求和目标。你为什么要这个?你想解决什么问题?也许有一种更好的方法可以在一步之后解决同样的问题...