V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Insomnia
V2EX  ›  问与答

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

  •  
  •   Insomnia · 2011-08-04 21:20:39 +08:00 · 4317 次点击
    这是一个创建于 4864 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景是这样的:
    为了简单的起见,这里认为是一个新闻系统,我需要有新闻的分类,然后新闻会选择属于那个分类

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

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

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

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


    三张表的话,那就先根据分类id,从第三张关系表中查出来对应的新闻id,再根据新闻id去新闻表查出来,但是如何新闻表中出来的时候,还要根据某个时候显示的字段来判断是否显示的话,那么这样分页的时候不好控制吧?难道在第三表冗余下,把这个新闻的是否显示等属性冗余过来下?
    manhere
        3
    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
        4
    sun019  
       2011-08-05 14:13:40 +08:00
    一个新闻只属于一个分类的话就是一对多,用两个表就可以了吧
    chloerei
        5
    chloerei  
       2011-08-05 14:25:16 +08:00
    @Insomnia JOIN 查询
    napoleonu
        6
    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
        7
    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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1366 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 23:39 · PVG 07:39 · LAX 15:39 · JFK 18:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.