使用ORM将对象与关系的历史关联

2024-09-30 20:36:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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类具有以下属性:

  1. 创建新计算机时不需要(独立于)位置(这是有意义的,因为位置表是独立的)
  2. 无需(独立于)计算机即可创建新位置
  3. 如果计算机具有位置,则它必须是位置的成员(外键约束)
  4. 更新现有Computers对象的位置时,将向ComputerLocations添加一个新行,日期时间为NOW()
  5. 创建带有位置的新Computers对象时,将向ComputerLocations添加一个日期时间为NOW()的新行
  6. 所有内容都应该是原子的(即,如果创建了新计算机,但无法创建将其关联到某个位置的行,则失败)

SQLAlchemy ORM中是否有特定的设计模式或具体的方法来实现这一点?文档中有一个关于Non-traditional mappings的部分,其中包括将类映射到多个表和任意选择,因此这看起来很有希望。此外,还有另一个提到vertical tables的堆栈溢出问题。由于我相对缺乏SQLAlchemy方面的经验,我还不能将这些信息合成为一个健壮而优雅的解决方案。任何帮助都将不胜感激

我使用的是MySQL,但解决方案对于通过SQLAlchemy方言系统的任何数据库都应该足够通用


Tags: 对象nameid类型sqlalchemy关系计算机时间