一条记录所属于分类的数据库设计问题

2011-08-04 21:20:39 +08:00
 Insomnia
场景是这样的:
为了简单的起见,这里认为是一个新闻系统,我需要有新闻的分类,然后新闻会选择属于那个分类

如果这条新闻只输入那天记录,一般是在这个新闻表加个 分类 字段,直接用,如果我的一天新闻属于多个分类,而且,分别查看每个分类的时候,都会显示出来这个新闻

那么除了我把分类表和新闻的id做个第三张对照表,还有更好的方法吗?
如果做了第三张对照表的话,如何设计这个表更好?
4240 次点击
所在节点    问与答
7 条回复
iwinux
2011-08-04 21:55:14 +08:00
假如只用两张表的话,一个比较山寨的方法是以字符串的方式存储多个 category id,然后自己负责解析……

三张表就简单了,是 Has And Belongs To Many,或者叫 Many To Many 关系

第三张表有两个字段就可以了:category_id 和 article_id
Insomnia
2011-08-04 22:02:22 +08:00
只存一张表的话,用字符串村了,那单独查看这个分类的新闻时,如何解析呢?


三张表的话,那就先根据分类id,从第三张关系表中查出来对应的新闻id,再根据新闻id去新闻表查出来,但是如何新闻表中出来的时候,还要根据某个时候显示的字段来判断是否显示的话,那么这样分页的时候不好控制吧?难道在第三表冗余下,把这个新闻的是否显示等属性冗余过来下?
manhere
2011-08-04 23:23:19 +08:00
article表:article_id article_content ...
cata表:cata_id cata_name ...
relation表: cata_id article_id ...

一直这样用,感觉很灵活
sun019
2011-08-05 14:13:40 +08:00
一个新闻只属于一个分类的话就是一对多,用两个表就可以了吧
chloerei
2011-08-05 14:25:16 +08:00
@Insomnia JOIN 查询
napoleonu
2011-08-05 15:07:23 +08:00
如果用Join的话,你在2楼的问题都不是问题,Join的过程就是按照一定的规则把多张表合并成一张表,既然成了一张表你要按照什么排序筛选都没问题。数据量大的时候Join也很难受。

我再说两个我想到的,可用不可用自己判断哈

1.你可以评估或这限定一下比如一个新闻同时最多只能属于4个分类,那就加四列分类信息字段。但是如果根据分类查新闻的时候可能索引的利用效率不是很好 cat1=1 or cat2=1 or cat3=1 or cat4=1 这样。

2.如果一篇文章属于多个分类的情况不多可以选择对一篇文章的内容插入多行数据,除了分类信息不一样。这样根据分类查询文章就很简单了,但是如果要对文章进行更新可能就多消耗点资源了,空间也有所浪费。

虽然上面两个方法有违一般的设计思想,但是根据场景的不同也不是绝对不可用,我觉得 :)
icyflash
2011-08-05 16:15:35 +08:00
可参考wp的设计, 达到你的要求用了四张表,但是扩展方便。特别是对做新闻类的
http://codex.wordpress.org/zh-cn:%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%8F%E8%BF%B0
1.wp_posts
2.wp_terms
3.wp_term_relationships
4.wp_term_taxonomy

关于一、二、三张表的设计请看这篇文章
http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/16484

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX