2 jiangboyao1993 jiangboyao1993 于 2016.04.04 22:33 提问

当一条记录拥有不确定个数个tag时,怎么设计数据库结构,又怎么通过tag来进行检索? 5C

1.就以知乎为例吧,一个问题可能有多个tag来进行标注,这些tag是用怎么的结构在数据库中存储的呢?
很多人说再整理出一张tags的表,和一张tags和id对应的表,有谁能够详细说明一下这个东西怎么设计?
2,当进行检索的时候,怎么能够快速高效地通过tag/tags来进行检索呢?

3个回答

caozhy
caozhy   Ds   Rxr 2016.04.04 22:45

假设你的主表叫topic,主键id
tags表作为关联表,结构为id topicid tag,外键topicid
进行关联查询

或者在topic表增加一个字段叫tags,用逗号分隔直接存。

或者出于性能的考虑,同时保持以上两个设计,也就是存在冗余的数据。

u012377333
u012377333   Rxr 2016.04.05 19:59

看一下数据库的三大范式。
重新新建一张表;管理问题和tag之间的关系。

GuYueDream
GuYueDream   2016.04.07 16:14

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于使用一条SQL语句 找出同时符合多个tag条件的记录集合算法
Web应用中,对记录集的Tag运算中 找出同时符合多个tag条件的记录集合算法,SQL 语句解决方案。
如何通过tag值改变对应对象属性----IOS开发
在改变这个对象之前,开发者肯定知道这到底是个什么对象例如:UIButton,UILabel,或则自己写的控件对象以下是我自己的View写的View控件AddServerPersonView *findView = (AddServerPersonView *)[self.view viewWithTag:viewTag];findView.backgroundColor = [UIColor re...
标签(Tag)的数据库设计
Segmentfault在文章编辑界面即有用到标签,那么这个是如何实现的呢? 通过最爱的stackoverflow,找到了一些方法,其中用到的最多的一种解决方案如下: 简单的表结构 首先增加一个Tag表,用来存储你的标签 涉及到的查询伪语句 插入新的Tag 这个这么简单就不写咯,(>^ω^插入新的关联 首先找到Tag对应的id select id from tag_ta
Vlan 中 Tag / Untag 报文处理
为了理解VLAN内报文的转发,就必须要知道交换机对于不同VLAN报文的tag/untag的处理原则。 首先,需要明确一点就是,在交换机的内部,为了快速高效的处理,报文都是带tag转发的。其实,这点很好理解,因为交换机上很可能会配置多个VLAN,那不同VLAN流量区分只有依靠tag标签。 下面从报文入和报文出两个方向来介绍。 l         报文入方向: 在入方向上,交换机的根本任务就是
IOS动态创建控件通过tag处理单击事件
1.在开发中,我们很多时候需要动态创建控件.在创建控件的时候给控件设置一个tag值,利用这个tag值来操作控件. 2.创建控件一般要设置控件的大小和位置,这两个属性是最重要的.最后利用addSubview:方法将控件添加到指定的容器即可. 3.通过tag获取控件然后操作控件的属性等,我们可以遍历父控件,通过tag找到指定的控件. 4.给按钮添加单击事件要利用addTarget:(
SubViews中如果根据tag获取到指点的 UIView – viewWithTag
通常我们在初始化页面后,在UIView 上动态的添加多个子 View 时,又没设置类成员变量,在相关的操作中又要使用到那些子视图的控件。这时我们就可以用 viewWithTag 这个方法来获取相关子视图的变量,以方便操作。 类似例子: UIImageView *leftMsgBg = [[[UIImageViewalloc] initWithFrame:CGRectMake(0, 
jsp程序设计-Tag文件与Tag标记用法详解
新建tag文件注:tag文件一般被放至/WEB-INF/tags目录下 Jsp页面中引用tag文件(声明标记库)jsp页面头部:<%@ taglib prefix="前缀" tagdir="自定义标记库的位置(一般为/WEB-INF/tags)"%> //prefix属性为前缀 jsp页面中使用tag标签(jsp页面像tag文件中传值):<前缀:tag文件名 对象1名字="对象1的引用 对象2名字
[小技巧] git 取得两个 tag 之间的 commit
参考:http://stackoverflow.com/questions/5863426/get-commit-list-between-tags-in-git git log --pretty=oneline tagA...tagB If you just wanted commits reachable from tagB but not tagA: git log --pr
iOS开发笔记--viewWithTag获取subview规则详解
通常我们在view层级里面对subView的操作可以通过两种方式:1、保留一个subview的引用,然后在类中通过该引用对该subview进行操作,但是要注意在适当的位置添加内存维护的代码,退出前手动释放。2、设置subview的Tag,让后在要使用的时候,通过viewWithTag获取到相应的subview,这种方法比较简洁,也不用自己去维护内存。   ViewWithTag: 通常采用深
EventBus设置TAG,可以更灵活的发送和接收消息
EventBus设置TAG今天和同事谈到了组件通信的EventBus,说到了回调的实现,java代码可以通过注册回调实现被调用者通知调用者,可是EventBus只能来回发消息,感觉有点麻烦,如果发送对象的话还得区分对象,每个事件写一个这很明显是不明智的,上网搜了一下EventBus是否有类似回调的机制,然后就看到了TAG这个东西,类似于msg.what,这样就可以通过泛型、object或者bundl