如何为不同的表使用相同的字段作为外键?

时间:2016-02-08 11:26:43

标签: sqlalchemy foreign-keys many-to-many

我有许多表可用作源数据,每个科学区域一个(BioData,GeolData,GravData,MagnData等)。 还有另一个表,主要名称为Product,它存储每个产品的信息,如id,项目关联等。每个产品也由一组数据组成。这些数据记录存储在那些纪律表中。

例如,为了存储BioData的产品和数据记录之间的关系,我所做的就是创建一个名为Dataset_Data的多对多表。这个声明是使用sqlacodegen生成的,它是一个'SQLAlchemy的自动模型代码生成器'。

t_Dataset_Data = Table(
    'Dataset_Data', metadata,
    Column('dataset_id', ForeignKey(u'Product.product_id'), primary_key=True, nullable=False),
    Column('data_id', ForeignKey(u'BioData.id'), primary_key=True, nullable=False),
    schema='public'
)

class Product(Base):
    __tablename__ = 'Product'
    __table_args__ = {u'schema': 'public'}

    project_id = Column(ForeignKey(u'Projects.p_id'), nullable=False)
    dataTable_id = Column(ForeignKey(u'DataTables.id'), nullable=False)
    product_id = Column(Integer, primary_key=True)

    project = relationship(u'Projects')
    datatablename = relationship(u'DataTables')

    data = relationship(u'BioData', secondary=t_Dataset_Data)

使用sqlAlchemy,当我访问某个Product对象时,使用prod.data,我将可以访问与我的产品相关的所有BioData记录。 到目前为止一切都很好。

我现在需要的是允许Product与所有其他数据表的关系,即不使用BioData,而是使用另一个数据表,例如GeolData。请注意,一个产品始终只与一个规则表相关联,即根据产品的dataTable_id使产品来自同一数据表的数据记录。 所以我需要的是在t_Dataset_Data上声明外键可能是另一个表(而不仅仅是Biodata),因此Product的'data'属性可能是另一个来源。

简而言之,我需要知道是否可以在Dataset_Data的'data_id'列中使用不同的FK,即,如何使用此列指向不同的表。 如果不可能,这可能是实现我需要的最佳方法吗?

0 个答案:

没有答案