将传感器模型连接到其他模型的最佳关联方法

Best association approach to connect Sensor model to others

我正在尝试使用 Flask+SQLAlchemy 实现以下功能: 我有两个数据库模型,其中包含有关养蜂场和蜂箱的信息。我想添加功能以某种方式将它们连接到传感器模型。这些可以连接到一个养蜂场或一个蜂箱。这是我的。

class Apiary(db.Model):
    __tablename__ = 'apiary'
    # ... fields ...
    beehives = db.relationship("BeeHive", backref=db.backref('apiary', lazy='dynamic'), lazy='dynamic')


class BeeHive(db.Model)
    __tablename__ = 'beehive'
    # ... fields ...
    apiary_id = db.Column(db.Integer(), db.ForeignKey('apiary.id'))


class SensorType(db.Model):

    __tablename__ = 'sensor_type'

    id = db.Column(db.Integer(), primary_key=True)
    title = db.Column(db.Unicode(32), unique=True)
    sensors = db.relationship('Sensor', backref=db.backref('sensor_type', lazy='dynamic'), lazy='dynamic')


class Sensor(db.Model):

    __tablename__ = 'sensor'

    id = db.Column(db.Integer(), primary_key=True)
    serial = db.Column(UUID(), unique=True)
    sensor_type_id = db.Column(db.Integer(), db.ForeignKey('sensor_type.id'))
    readings = db.relationship('SensorReading', backref=db.backref('sensor', lazy='dynamic'), lazy='dynamic')


class SensorReading(db.Model):

    __tablename__ = 'sensor_reading'

    id = db.Column(db.BigInteger(), primary_key=True)
    value = # TODO
    timestamp = db.Column(db.DateTime(), default=db.func.now())

我在网上冲浪,阅读 SQLAlchemy 文档并找到了一些关于 "polymorphic loading" 的信息。我有一种很好的感觉,这可能就是我正在寻找的东西,但不知道如何在我的案例中实现它。我在 "Django world" 看到过类似的东西,他们称之为 "GenericForeignKey"。

更新:我发现 SQLAlchemy examples 关于这种类型的关联。谁能告诉我哪些是最佳方法? discriminator_on_related、generic_fk、table_per_association 还是 table_per_related?其中哪一个在进一步扩大应用方面最不头疼?级联删除?

经过两天的实验,我得出了最终结论。示例取自 this 来源。

  • "Discriminator on association"(候选答案):

    • (+) 有后向引用
    • (?) 可以有 1 个 parent object
    • (-) 复杂度
  • "Generic Foreign Key":

    • (+) 低复杂度
    • (+) 有后向引用
    • (?) 可以有 1 个 parent object
    • (-) 程序员的代码必须处理级联操作
  • "table per association":

    • (+) 多个 parents
    • (+) 共享 table 保持完整
    • (?) table 的数量随关联的 table 的数量增加
    • (-) 没有向后引用
  • "table per related"(候选答案):

    • (+) 每个关联的 object 都在同一个 table
    • (+) 可以有多个 tables
    • (-) 关联的 object 以某种方式为每个外国 table
    • 分开

回答:"Discriminator on association"因为Sensor没有叠加能力所以不需要多个parent。