大家在某些博客都可以看到文章会带上一些标签,标签的作用是对目标进行分类,让浏览博客的人能更快找到自己需要的内容,提高查阅效率。

比如本博客的标签示例:

点击标签就会进入相应的标签目录。

博客文章与标签的关系

正如上面的图片所示,一个文章可以有多个标签,而一个标签下也可以拥有多篇文章,所以很显然,文章与标签是一个多对多的关系。

文章与标签的数据库关系设计

除了文章表与标签表,多对多关系中间还都会有一个关系表,我们用这个表的每一条记录来表示一篇文章与一个标签的关系。

文章与标签的数据库关系的实现

我使用的是基于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建立关系等等。

评论

  • 最新随笔

  • 对我来说,写东西很好的一点是,自己写的东西,后面基本都会再看,一遍或者很多遍。这样就可以很好地发现自己之前的漏洞,并看看现在有什么变化。
  • 前段时间应该是百度更新了页面结构,那个黑帽泛目录网站我也没有去更新代码,就导致了文章页没有相关推荐,没想到这时候谷歌开始收录了,而且效果还不错。其实之前在谷歌一直不收录的时候就有怀疑过没有尽头的相关推荐很可能是导致不收录的原因,不过也一直没有去管它,而这次误打误撞的收录也恰恰证实了这个想法。(btw,其实这个网站从出现固定链接开始叫泛目录应该不太准确)
  • 最近吉他谱网站iloveguitar上线了,这几天在填充一些内容花了一些时间,这个网站也是使用flask作为后端框架的,前端UI框架使用的是bootstrap4,喜欢吉他的小伙伴欢迎来这里逛一逛哟,有什么建议欢迎在留言板提一下哟。
  • 那个泛目录网站发布了几个星期了,百度没怎么来爬,收了一个首页,谷歌直接就不收了,倒是一个查外链的网站天天来爬(笑哭),还有建议一点就是泛目录还是用在有建站历史的域名比较好(因为已经过了审核期),新域名就尽量不要用了。
  • 刚刚又发了一篇,最近文章百度都不太收录,orz,哈哈
  • 之前那个用python做的静态资源服务器,我又发现了一大用处,现在我都用来在局域网里的不同电脑之间传输文件,真的好用哈哈
  • 今天交换到了博客有史以来第一条友情链接
  • 刚刚更新了一下博客,修复了一些bug,添加了一个项目页