在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级别上做同样的事情。
答案 0 :(得分:1)
不,在PostgreSQL中没有类似的东西。
您可以自己构建触发器,可能使用复合类型。但是你说(出于某种原因)你不想使用PL / PgSQL,所以你已经排除了这一点。但是,获得正确的RI触发器非常困难,并且必须对引用和引用的结束应用触发器。
坦率地说,这似乎是一个方形钉,圆孔问题。你确定PostgreSQL是这个应用程序的正确选择吗?在上下文中描述您的需求和目标。你为什么要这个?你想解决什么问题?也许有一种更好的方法可以在一步之后解决同样的问题...