将传感器模型连接到其他模型的最佳关联方法
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。
我正在尝试使用 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。