的任意行和现场是否有任何形式的(数据类型,内在..)的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引用各种不同的表? –
这是最好的总结。 –