我使用flask-sqlalchemy(Flask的ORM)创建了两个表,其中一部分我总结如下:
Sites
|---------------------|------------------|------------------|
| name | site_code | site_type |
|---------------------|------------------|------------------|
| Aberdeen | ABD | urban |
|---------------------|------------------|------------------|
| Cardiff | CRD | urban |
|---------------------|------------------|------------------|
Data
|---------------------|------------------|------------------|
| site_code | time | temperature |
|---------------------|------------------|------------------|
| ABD | 13:00 | 23 |
|---------------------|------------------|------------------|
| CRD | 13:00 | 26 |
|---------------------|------------------|------------------|
我的模型如下:
db = SQLAlchemy()
class Sites(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
site_code = db.Column(db.String(10))
site_type = db.Column(db.String(100))
def __init__(self, name, site_code, site_type):
self.name = name
self.site_code = site_code
self.site_type = site_type
class Data(db.Model):
id = db.Column(db.Integer, primary_key=True)
site_code = db.Column(db.ForeignKey('sites.site_code'))
time = db.Column(db.String(100))
site_type = db.Column(db.String(100))
def __init__(self, site_code, site_type, temperature):
self.site_code = site_code
self.site_type = site_type
self.temperature = temperature
我不确定每个表中的site_code列是否相关。这是因为虽然它们具有相同的值(ABD,CRD等),因为它们对应于相同的数据监控站点,但它们似乎没有任何其他方式相关。它们是否相关并且指定site_code的外键是否合适?只是因为我在我的数据表中有冗余,每小时我都会一遍又一遍地重复site_code。 Sites表是一个大约20行的站点列表,而Data每小时重复20次。
由于我目前的模型是结构化的,我认为db.ForeignKey('sites.site_code')没有做任何事情,因为我传入了site_code(可以看出我在哪里定义 init for Data)。如果我没有传递它,则值为null - 当我填充数据时,我认为没有任何方法可以知道如何使用站点中的site_code值。
我是否有更好的方法来构建模型,以便我可以从Data中的Sites表引用site_code,这样我就不会在我的Data表中存储冗余的site_code值?或者这不值得担心吗?我在查询数据时需要使用site_code,因此不能只有Sites.id的外键。而不是site_code。例如:
foo = Data.query.filter_by(site_code='ABD')
答案 0 :(得分:0)
好的,为了实现您所寻找的目标,您首先要了解如何设计模型,我确定您需要一对一的关系,看看here 并发现了这个:
One To One本质上是一个带标量的双向关系 双方属性。为实现此目的,uselist标志指示 标量属性的放置而不是集合的放置 “很多”方面的关系。将一对多转换为 一对之一:
您的代码可以在这里
db = SQLAlchemy()
class Sites(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
site_code = db.Column(db.String(10))
site_type = db.Column(db.String(100))
datas = db.relationship("Data", uselist=False, back_populates="sites_codes")
def __init__(self, name, site_code, site_type):
self.name = name
self.site_code = site_code
self.site_type = site_type
class Data(db.Model):
id = db.Column(db.Integer, primary_key=True)
site_code = db.Column(db.Integer, db.ForeignKey('sites.site_code'))
time = db.Column(db.String(100))
site_type = db.Column(db.String(100))
site_codes = db.relationship("Sites", back_populates="datas")
def __init__(self, site_code, site_type, temperature, name):
self.name = name
self.site_code = site_code
self.site_type = site_type
self.temperature = temperature