大家在某些博客都可以看到文章会带上一些标签,标签的作用是对目标进行分类,让浏览博客的人能更快找到自己需要的内容,提高查阅效率。
比如本博客的标签示例:
点击标签就会进入相应的标签目录。
正如上面的图片所示,一个文章可以有多个标签,而一个标签下也可以拥有多篇文章,所以很显然,文章与标签是一个多对多的关系。
除了文章表与标签表,多对多关系中间还都会有一个关系表,我们用这个表的每一条记录来表示一篇文章与一个标签的关系。
我使用的是基于SQLAlchemy(orm工具)的flask_sqlalchemy包,对于设计数据库模型是非常方便的。
首先先写一个关系表
registrations=db.Table('registrations',
db.Column('post_id',db.Integer,db.ForeignKey('posts.id')),
db.Column('tag_id',db.Integer,db.ForeignKey('tags.id')))
然后在文章表或标签表中定义关系
class Post(db.Model):
__tablename__='posts'
id=db.Column(db.Integer,primary_key=True)
title=db.Column(db.String(64))
body=db.Column(db.Text)
...
tags=db.relationship('Tag',
secondary=registrations,
backref=db.backref('posts',lazy='dynamic'),
lazy='dynamic')
class Tag(db.Model):
__tablename__='tags'
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(64),index=True,unique=True)
>>>tag=Tag(name='python')
>>>db.session.add(tag)
>>>post=Post(title='title',body='body'...)
>>>post.tags.append(tag)
>>>db.session.add(post)
>>>db.session.commit()
还可以在post模型中添加一些方法,让操作更加简单,比如将一段由空格分隔的标签集合字符串('python code balabala'
)转换成一个个tag实例,然后与post建立关系等等。