模式中常见的关系类型是:joiner表具有datetime元素,用于存储有关两个其他表的行之间关系的历史记录。这些关系是一对一或一对多的,即使我们使用通常意味着多对多的关联表。在任何给定的时间点,只有一个映射,即该时间点的最新映射是有效的。例如:
Tables:
Computer: [id, name, description]
Locations: [id, name, address]
ComputerLocations: [id, computers_id, locations_id, timestamp]
一个Computers
对象一次只能属于一个Locations
个对象(Locations
可以有多个Computers
),但我们会将历史记录存储在表中。 ComputerLocations
中的行不会被删除,只会在查询时被新行取代。也许在将来,一些修剪类型事件将删除旧行,因为它们的用处减少了。
我正在做的是在SQLAlchemy中对此进行建模,特别是在ORM中,以便Computers
类具有以下属性:
Computers
对象时,新行将添加到ComputerLocations
,日期时间为NOW()SQLAlchemy ORM中是否有特定的设计模式或具体方法来实现此目的?该文档有一个关于Non-traditional mappings的部分,其中包括将一个类映射到多个表和任意选择,因此这看起来很有希望。还有另一个提到vertical tables的stackoverflow问题。由于我对SQLAlchemy的相对缺乏经验,我无法将这些信息合成为一个强大而优雅的解决方案。任何帮助将不胜感激。
我使用的是MySQL,但通过SQLAlchemy方言系统,任何数据库的解决方案都应该足够通用。