关于商城系统中商品类别的设计(续篇)
创始人
2024-07-31 22:01:29
0

上一节《关于商城系统中商品类别的设计》中我说数据库设计有一块硬伤,到底在哪儿?先看下图:

 

 

看上图中有什么地方是相同的?

“品牌”→“三星”在手机数码分类里面有,在电脑办公分类里面也有,这有什么问题?再来看看上篇中的那个关系图:

 

再看数据库中存储的数据,首先是(T_FilterCategory表)

 

如下(T_FilterAttributes表)

 

如下(T_FilterCategory与T_FilterAttributes之间的关联表)

 

如上图,既然“品牌”→“三星”在手机数码分类里面有,在电脑办公分类里面也有,那么如果只是像上面这个关联表这么保存筛选条件和筛选条件值,我如何区分哪个是手机数码下的“品牌”→“三星”,哪个是电脑办公分类下的“品牌”→“三星”?如果我不区分它,会发生什么情况?现在有这么个业务,需要我通过用户选择的三级类别,展示出指定三级类型下的“筛选条件”和对应的“筛选条件值”,那么我该怎么实现呢,按照上面的关系图,假设用户点击了“手机数码分类”下的“手机”,它的类别编号为“14”,那么我可以写出如下SQL语句:

***步,根据用户选择的类别获取其下的“筛选条件”。

  1. select fc.fc_Id,fc.fc_Name from T_FilterCategory as fc  
  2. inner join RF_Columns_FilterCategory as cfc on fc.fc_Id = cfc.fc_Id  
  3. inner join T_Columns as col on cfc.col_Id = col.col_Id  
  4. where col.col_Id = '14' 

执行结果如下:

现在我再根据上面的“筛选条件”获取对应的“筛选属性值”:

  1. select fa.attr_Id,fa.attr_Name from T_FilterAttributes as fa  
  2. inner join RF_FilterCategory_TFilterAttributes as fcfa on fa.attr_Id = fcfa.attr_Id  
  3. inner join T_FilterCategory as fc on fcfa.fc_Id = fc.fc_Id  
  4. where fc.fc_Id in 
  5. (select fc.fc_Id from T_FilterCategory as fc  
  6. inner join RF_Columns_FilterCategory as cfc on fc.fc_Id = cfc.fc_Id  
  7. inner join T_Columns as col on cfc.col_Id = col.col_Id  
  8. where col.col_Id = '14') 

结果如下:

看上面红色方框中的“筛选属性值”,像宏碁、华硕、戴尔、Gateway、清华同方等,它们是电脑厂商,而不是手机厂商,然而却出现在手机类别下,这不是有问题吗?

所以这种设计有问题,因为它缺了一张表!这张表就是存储关联表RF_FilterCategory_TFilterAttributes与T_Columns表之间的关系的中间表。为什么要加中间表?因为一个三级类别可以对应多个RF_FilterCategory_TFilterAttributes,而一个RF_FilterCategory_TFilterAttributes又可以被多个三级类别拥有。图示见:顶部 图(1)

于是我继续加表,名曰:RF_Columns_FilterCategory_FilterAttributes,如下图:

 

然后建立外键关联,如下图:

 

然后完整的关系图如下:

 

然后我再次执行上面那个业务,假设用户选择的三级类别的编号为14,我需要获取其下的所以“筛选条件值“,那么SQL语句如下:

  1. with t as   
  2. (   
  3. select FA.attr_Id,FA.attr_Name,CDF.col_Id,CDF.sort from T_FilterAttributes as FA   
  4. inner join dbo.RF_FilterCategory_TFilterAttributes as DF on FA.attr_Id = DF.attr_Id   
  5. inner join dbo.RF_Columns_FilterCategory_FilterAttributes as CDF on CDF.df_Id = DF.df_Id and CDF.col_Id = '14'   
  6. )   
  7. select t.attr_Id,t.attr_Name from t   
  8. inner join dbo.RF_FilterCategory_TFilterAttributes as DF on t.attr_Id = DF.attr_Id   
  9. inner join dbo.T_FilterCategory as FC on DF.fc_Id = FC.fc_Id and FC.fc_Id in   
  10. (  
  11.  select fc.fc_Id from T_Columns as tc  
  12.  inner join dbo.RF_Columns_FilterCategory as cdc on tc.col_Id = cdc.col_Id   
  13.  inner join T_FilterCategory as fc on cdc.fc_Id = fc.fc_Id14 where tc.col_Id = '  
  14. '  
  15. )  
  16.  
  17. 16 order by t.sort 

然后就得到如下所有手机类别下的“筛选条件“对应的”筛选条件值“,如下图:

 

 

原文链接:http://www.cnblogs.com/twittersu/archive/2011/06/14/2080868.html

【编辑推荐】

  1. 关于商城系统中商品类别的设计
  2. 数据库标准化与范式
  3. 数据库设计三大范式应用实例剖析
  4. 知道数据库设计的三大范式吗
  5. 数据库应用呈三大趋势 DBA要如何应对

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...