拿新闻举例:新闻记录可分为“普通新闻”和“推荐新闻”,则建表时有两种方案:
1 只建一个新闻表,在表中设置一个“是否推荐”字段,以区分两种新闻类型;
2 建两个表。一个新闻表,用于保存新闻记录;一个推荐表,用于保存新闻表中“推荐新闻”的对应ID号。
讨教一下,这两种方案,分别有什么优劣?

解决方案 »

  1.   

    1, 方便编程,不利扩展.
    设是否推荐字段为 f3, tinyint ,普通为0,推荐为1, 显示时推荐在上,普通在下
    以后要再加一类型, 头条新闻 , f3值为 2, 显示时在推荐之上. 此时都可以按 order by f3 desc实现.
    以后要再加一类型, xxxx, 但它的排序要在头条和推荐之下, 这时你排序就成问题了, 还要加 case when,可以实现
    以后再加几个类型,x1,x2,x3,, 如果排序,那就那具体f3值依赖性太大了.2,利于扩展,相对于1稍麻烦一点点.
    这里不是说哪个好,好个坏, 任何方式都有利有弊, 适应你需要的才是最好的.
      

  2.   

    是的.会少些.但是用tinyint,这个空间问题可以呼略的. 
    数据库设计的几个范式之间本身就是茅盾的,主要的是找平衡, 其实主要还是看业务需要,在某些时候是可以牺牲一些空间,以冗余换效率.
      

  3.   

    对于第二种方案. 可以动态扩充.比如考滤排序的话, 可以给每个类别一个排序列.
    即新闻类型表增加新字段一个idx,用来调整某类新闻的顺序号.这样看起来, 好像第一种依赖f3的值, 第二种依赖idx的值,好像是一样的.其实不然第一种,
    在你的服务器上 news表为空表.  项目中定义 f3{0=普通,1=推荐,2=头条}
    除了影响排序外, 
    那么你在很多其它地方, 比如首页,可能有一个block,或者说page area 就是放的推荐新闻.那么这里块加的就是 shownewslist.aspx?type=1 或 用一个方法带参数直接输出 shownewlist(1).
    当你新加了 3=x的设定之后, 首先他影响了排序.
    如果不改设定值, 那么 order by case when ...或 order by charindex ... 很有效率问题
    如果改了设定值,那就相当于 f3(0=普通,1=x,2=推荐,3=头条), 这样,排序还是可以直接 order by f3
    但是因为你的项目最初定义的设定值改了, 那么很多地方都要改,比如那个 page area显示推荐新闻的地方.
    这里看起来好像没什么, 但是, 在实际应用中,不是改个显示位置的问题. 
    在实际项目开发中,设定值是要求尽量不允许改的.第二种
    一直是order by idx 
    idx值可以自己调, 不需要在程序的其它位置改动.
    所以没有上述问题.
      

  4.   

    第一种, 还有很多问题.比如,哪天你领导心血来潮,要将 推荐新闻 这名字改为 新闻推荐, 那就得update整个news表, 数据量小倒没什么. 数据量大也没什么,反正是news表.
    如果是实际业务中,那就不简单的是改个新闻分类名的问题