我们已经在之前的数据库章节中看到过了一对多的关系类型。这儿有个图解:
这个关系类型中,两个实体users和posts关联。我们说一个用户可以有很多条微博,而一条固定微博只能是由一个用户发的。在数据库中这种关系类型通过在“多”的一方添加“一”的一方的外键来表示。在上面的例子中外键就是将user_id添加到posts表中。这个字段标明了不同微博和它在用户表中用户的关联。
user_id清晰的提供了用户和所发微博的直接关系,但是反过来肿么样呢?让这种关系类型变得更加有用,我们需要获取给定用户的所有微博。结果是posts表中的user_id已经足够回答这个问题,如果数据库有索引那么它将支持更有效率的查询方法例如“当user_id为xxoo是检索所有微博”。
多对多关系类型有点复杂。比如一个例子,想象一个拥有学生和老师的数据库。我们可说一个学生可以有多个老师,一个老师可以有多个学生。这就像是两个重叠的一对多关系。
这种数据库关系下我们可以查询数据库获得教一个学生的所有老师的列表,以及一个老师的课程下所有学生的列表。但它实现起来比较棘手,它不能通过在已存在的表中增加外键来实现。
想要实现多对多关系需要增加一个叫association的辅助表。这儿有个数据库如何查找学生和老师的例子:
它是轻而易举的,包含两个外键的association表能有效地解决很多类型的查询,例如:
稍微改变一下我们的数据库模型。我们从增加followers表开始(file app/models.py):
followers = db.Table('followers', db.Column('follower_id', db.Integer, db.ForeignKey('user.id')), db.Column('followed_id', db.Integer, db.ForeignKey('user.id')) )
这是从我们上面的图解中直接翻译的结果。注意我们没有像users和posts表那样说明这个表作为模型。因为这是一个除了外键没有任何数据的辅助表,我们使用Flask-SQLAlchemy中低级的APIs创建这个表而不实用associated模型。
评论删除后,数据将无法恢复
评论(4)
引用来自“HQNY”的评论
在执行 “flask\Scripts\python db_migrate.py”时,报错:NameError: name 'followers' is not defined,求解啊。。