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

比如本博客的标签示例:

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

博客文章与标签的关系

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

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

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

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

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

  • 最新随笔

  • 增加一些流动的云
  • 文章页也调整了下(图一旧,图二新)
  • 给首页调了下样式,图一旧版、图二新版。vibe coding之后,改起老项目反倒成了一种娱乐。
  • 昨天睡觉的时候反复梦到“人本主义”这个词,可是最近好像都没有相关的知识接触过,半梦半醒的时候还去搜了下具体含义,找了些视频看了下
  • 在AI时代尽可能在行业、学科的宽度上扩展,尽量尝试一些跨学科的事情、阅读一些跨学科的书籍和资料,应该会有很大收益。
  • 跟qoder和deepseek一起把之前想做的一些人生管理系统整合到博客上了,感觉还不错,顺便让它们帮我弄了一个数据大屏,放在平板上实时播放也不错。本来想单独做成独立的系统,想想感觉徒增维护成本,那就干脆合并到博客了。也能增加自己打开博客的频率,增加输出内容的概率。
  • 改了下首页的顶部banner,加了个背景图,新旧对比
  • 让qodercli改了改博客,这速度效率真的史无前例地高,连commit和push都交给它了。效果和claudeCode有的一比,用了一段时间,真的还可以。