【发布时间】:2012-06-07 19:44:57
【问题描述】:
我正在使用 sqlalchemy 设计一个数据库来存放科学测试数据。我遇到了一个我似乎无法弄清楚的问题。
在我的测试数据中,每个Observation 都有一个State(位置、速度、加速度),而State 有一个关联的Time(状态适用的时间)。到现在为止还挺好。我为Times 做了一个单独的表格,因为我处理不同类型的时间,我想使用一个参考表来指示每个时间是什么类型的时间(状态时间、观察时间等)。而且我处理的时间类型可能会发生变化,因此我认为以这种方式标准化可以让我在未来添加新的时间类型,因为它们只是参考表中的行。
到目前为止,这部分工作(使用声明式样式):
class Observation(Base):
__tablename__ = 'tbl_observations'
id = Column(Integer, primary_key=True)
state_id = Column(Integer, ForeignKey('tbl_states.id'))
state = relationship('State', uselist=False)
class State(Base):
__tablename__ = 'tbl_states'
id = Column(Integer, primary_key=True)
time_id = Column(Integer, ForeignKey('tbl_times.id'))
time = relationship('Time', uselist=False)
class Time(Base):
__tablename__ = 'tbl_times'
id = Column(Integer, primary_key=True)
time_type_id = Column(Integer, ForeignKey('ref_tbl_time_types.id'))
time_type = relationship('TimeType', uselist=False)
time_value = Column(Float)
class TimeType(Base):
__tablename__ = 'ref_tbl_time_types'
id = Column(Integer, primary_key=True)
desc = Column(String)
问题在于,观察本身可以有不同的时间。当我尝试在Observation 和Time 之间创建一对多关系时,出现循环依赖错误:
class Observation(Base):
__tablename__ = 'tbl_observations'
id = Column(Integer, primary_key=True)
state_id = Column(Integer, ForeignKey('tbl_states.id'))
state = relationship('State', uselist=False)
# Added this line:
times = relationship('Time')
class Time(Base):
__tablename__ = 'tbl_times'
id = Column(Integer, primary_key=True)
time_type_id = Column(Integer, ForeignKey('ref_tbl_time_types.id'))
time_type = relationship('TimeType', uselist=False)
time_value = Column(Float)
# Added this line:
observation_id = Column(Integer, ForeignKey('tbl_observations.id'))
我猜这会中断,因为原来的 Observation -> State -> Time 链的引用权可以追溯到 Observation。
有没有办法解决这个问题?我把我的设计搞砸了吗?我在 sqlalchemy 中做错了吗?我对这一切都很陌生,所以它可能是上述任何一种。非常感谢您提供的任何帮助。
附:我尝试了这里推荐的操作:Trying to avoid a circular reference,但要么我做错了,要么它没有解决我的特定问题。
【问题讨论】:
标签: database orm sqlalchemy