将Sensor模型连接到其他人的最佳关联方法

时间:2015-02-01 11:00:46

标签: sqlalchemy flask-sqlalchemy

我尝试使用Flask + SQLAlchemy实现以下功能: 我有两个数据库模型,包含有关蜜蜂蜂房和蜂箱的信息。我想添加功能以某种方式将它们连接到Sensor模型。这些可以附在一个蜂房或一个蜂箱上。这就是我所拥有的。

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文档并发现了一些关于"多态加载"。我很好地感觉这可能是我正在寻找的,但我不知道如何在我的情况下实现它。我在" Django world"中看到过类似的东西。他们称之为" GenericForeignKey"。

更新:我找到了有关此类关联的SQLAlchemy examples。任何人都可以告诉我哪些是最佳方法? discriminator_on_related,generic_fk,table_per_association或table_per_related?在进一步扩大应用程序中哪一个最难以解决?级联删除?

1 个答案:

答案 0 :(得分:1)

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

  • "关联的判别者" (答案的候选人):

    • (+)具有向后引用
    • (?)可以有1个父对象
    • ( - )复杂性
  • "通用外键":

    • (+)低复杂度
    • (+)具有向后引用
    • (?)可以有1个父对象
    • ( - )程序员的代码必须处理级联操作
  • "每个协会的表格":

    • (+)多个父母
    • (+)共享表保持不变
    • (?)表的数量随关联表的数量而增加
    • ( - )没有向后引用
  • "每个相关的表格#34; (答案的候选人):

    • (+)每个关联的对象都在同一个表中
    • (+)可以有多个表
    • ( - )关联对象以某种方式为每个外表分开

回答:"关联的判别者"因为传感器没有叠加能力,因此不需要多个父母。