拿新闻举例:新闻记录可分为“普通新闻”和“推荐新闻”,则建表时有两种方案:
1 只建一个新闻表,在表中设置一个“是否推荐”字段,以区分两种新闻类型;
2 建两个表。一个新闻表,用于保存新闻记录;一个推荐表,用于保存新闻表中“推荐新闻”的对应ID号。
讨教一下,这两种方案,分别有什么优劣?
1 只建一个新闻表,在表中设置一个“是否推荐”字段,以区分两种新闻类型;
2 建两个表。一个新闻表,用于保存新闻记录;一个推荐表,用于保存新闻表中“推荐新闻”的对应ID号。
讨教一下,这两种方案,分别有什么优劣?
设是否推荐字段为 f3, tinyint ,普通为0,推荐为1, 显示时推荐在上,普通在下
以后要再加一类型, 头条新闻 , f3值为 2, 显示时在推荐之上. 此时都可以按 order by f3 desc实现.
以后要再加一类型, xxxx, 但它的排序要在头条和推荐之下, 这时你排序就成问题了, 还要加 case when,可以实现
以后再加几个类型,x1,x2,x3,, 如果排序,那就那具体f3值依赖性太大了.2,利于扩展,相对于1稍麻烦一点点.
这里不是说哪个好,好个坏, 任何方式都有利有弊, 适应你需要的才是最好的.
数据库设计的几个范式之间本身就是茅盾的,主要的是找平衡, 其实主要还是看业务需要,在某些时候是可以牺牲一些空间,以冗余换效率.
即新闻类型表增加新字段一个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值可以自己调, 不需要在程序的其它位置改动.
所以没有上述问题.
如果是实际业务中,那就不简单的是改个新闻分类名的问题