关于tag标签系统的实现

实验室的项目,需要做对用户发布的主题进行打标签的功能,纠结甚久,实现思路如下:

一、数据库表的设计

1.tag表

create table qa_tag
(
tag_id int primary key auto_increment,
tag_name varchar(32) not null,
tag_time timestamp not null default CURRENT_TIMESTAMP,
refered_cnt int not null default 0,
user_id int not null,
unique (tag_name),
constraint foreign key (user_id) references user_info(user_id)
);

2.topic表

create table qa_topic
(
topic_id int primary key auto_increment,
topic_title varchar(128) not null,
topic_body text not null,
topic_time timestamp not null default CURRENT_TIMESTAMP,
user_id int not null,
tags varchar(128) not null default ''
);
3.tag与topic的映射表

create table qa_tag_topic
(
record_id int primary key auto_increment,
tag_id int not null,
topic_id int not null,
constraint foreign key (tag_id) references qa_tag(tag_id),
constraint foreign key (topic_id) references qa_topic(topic_id)
);
二、逻辑实现

1.用户创建主题时,给自己发布的主题打上了几个标签,点击提交

2.后台接受参数后,先把数据插入到qa_topic表中,获得了topicId;

3.把用户输入的标签转成数组,批量插入到数据库中,sql代码如下:

<insert id="insertTags" parameterType="java.util.List">
	    insert into qa_tag(tag_name,user_id) values
	    <foreach collection="list" item="o" index="index" separator=",">
	        (#{o.tagName},#{o.userId}) 
	    </foreach>
	    ON DUPLICATE KEY UPDATE refered_cnt = refered_cnt + 1;//如果有重复,则把tag的被引用数目+1
	    alter table qa_tag auto_increment = 1//保证tagId的连续性
</insert>

4. 根据标签数组,查询插入后,这些标签的tagId(返回一个链表):

<select id="selectTagIds" resultType="com.tcm.dal.qaos.po.TagTopicMapPo">
	  SELECT 
	      tag_id as tagId
	  FROM qa_tag
	  WHERE tag_name 
	      in
	  <foreach item="item" index="index" collection="array"
	      open="(" separator="," close=")">
	        #{item}
	  </foreach>
</select>

5.然后,把tagId和topicId批量插入到qa_tag_topic:

<insert id="insertTagTopicMap" parameterType="java.util.List">
	    insert ignore into qa_tag_topic(tag_id,topic_id) values
	    <foreach collection="list" item="o" index="index" separator=",">
	        (#{o.tagId},#{o.topicId}) 
	    </foreach>
</insert>

6.把topicId返回即可。


三、问题

尚未测试这种方法的效率究竟如何……==






转载于:https://www.cnblogs.com/bingtel/p/4194456.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值