使用orm将对象与关系的历史关联起来

kkbh8khc  于 2021-06-21  发布在  Mysql
关注(0)|答案(0)|浏览(127)

模式中一种常见的关系类型是这样的:一个joiner表有一个datetime元素,用于存储另两个表的行之间随时间变化的关系的历史记录。这些关系是一对一或一对多的,即使我们使用的是一个通常意味着多对多的关联表。在任何给定的时间点上,只有一个Map是有效的,最晚的一个Map在该时间点上是有效的。例如:

Tables: 
    Computer: [id, name, description]
    Locations: [id, name, address]
    ComputerLocations: [id, computers_id, locations_id, timestamp]

Computers 对象只能属于一个 Locations 一次一个对象(和 Locations 可以有很多 Computers ),但我们将历史存储在表中。中的行 ComputerLocations 不会被删除,只会在查询时被新行取代。也许在将来,一些prune类型的事件会删除旧的行,因为它们的有用性会降低。
我要做的是在sqlalchemy中建模,特别是在orm中,这样 Computers 类具有以下属性:
不需要(独立于)位置就可以创建一台新计算机(这是有意义的,因为位置表是分开的)
不需要(独立于)计算机就可以创建新位置
如果计算机有位置,则它必须是位置的成员(外键约束)
更新现有computers对象的位置时,将向computerlocations添加一个新行,datetime为now()
创建新的 Computers 对象的位置,将向 ComputerLocations datetime为now()
一切都应该是原子的(即,如果创建了一台新计算机,但无法创建将其与某个位置关联的行,则会失败)
sqlalchemy orm中是否有特定的设计模式或具体的方法来实现这一点?文档中有一节介绍了非传统Map,其中包括将类Map到多个表和任意选择,因此这看起来很有前景。此外,还有另一个stackoverflow问题提到了垂直表。由于我对sqlalchemy相对缺乏经验,我还不能将这些信息合成为一个健壮而优雅的解决方案。任何帮助都将不胜感激。
我使用的是mysql,但是一个解决方案对于任何通过sqlalchemy方言系统的数据库来说都应该足够通用。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题