2022-10-23 288
上一节《关于商城系统中商品类别的设计》中我说数据库设计有一块硬伤,到底在哪儿?先看下图:
看上图中有什么地方是相同的?
“品牌”→“三星”在手机数码分类里面有,在电脑办公分类里面也有,这有什么问题?再来看看上篇中的那个关系图:
再看数据库中存储的数据,首先是(T_FilterCategory表)
如下(T_FilterAttributes表)
如下(T_FilterCategory与T_FilterAttributes之间的关联表)
如上图,既然“品牌”→“三星”在手机数码分类里面有,在电脑办公分类里面也有,那么如果只是像上面这个关联表这么保存筛选条件和筛选条件值,我如何区分哪个是手机数码下的“品牌”→“三星”,哪个是电脑办公分类下的“品牌”→“三星”?如果我不区分它,会发生什么情况?现在有这么个业务,需要我通过用户选择的三级类别,展示出指定三级类型下的“筛选条件”和对应的“筛选条件值”,那么我该怎么实现呢,按照上面的关系图,假设用户点击了“手机数码分类”下的“手机”,它的类别编号为“14”,那么我可以写出如下SQL语句:
***步,根据用户选择的类别获取其下的“筛选条件”。
selectfc.fc_Id,fc.fc_NamefromT_FilterCategoryasfc innerjoinRF_Columns_FilterCategoryascfconfc.fc_Id=cfc.fc_Id innerjoinT_Columnsascoloncfc.col_Id=col.col_Id wherecol.col_Id='14'
执行结果如下:
现在我再根据上面的“筛选条件”获取对应的“筛选属性值”:
selectfa.attr_Id,fa.attr_NamefromT_FilterAttributesasfa innerjoinRF_FilterCategory_TFilterAttributesasfcfaonfa.attr_Id=fcfa.attr_Id innerjoinT_FilterCategoryasfconfcfa.fc_Id=fc.fc_Id wherefc.fc_Idin (selectfc.fc_IdfromT_FilterCategoryasfc innerjoinRF_Columns_FilterCategoryascfconfc.fc_Id=cfc.fc_Id innerjoinT_Columnsascoloncfc.col_Id=col.col_Id wherecol.col_Id='14')
结果如下:
看上面红色方框中的“筛选属性值”,像宏碁、华硕、戴尔、Gateway、清华同方等,它们是电脑厂商,而不是手机厂商,然而却出现在手机类别下,这不是有问题吗?
所以这种设计有问题,因为它缺了一张表!这张表就是存储关联表RF_FilterCategory_TFilterAttributes与T_Columns表之间的关系的中间表。为什么要加中间表?因为一个三级类别可以对应多个RF_FilterCategory_TFilterAttributes,而一个RF_FilterCategory_TFilterAttributes又可以被多个三级类别拥有。图示见:顶部 图(1)
于是我继续加表,名曰:RF_Columns_FilterCategory_FilterAttributes,如下图:
然后建立外键关联,如下图:
然后完整的关系图如下:
然后我再次执行上面那个业务,假设用户选择的三级类别的编号为14,我需要获取其下的所以“筛选条件值“,那么SQL语句如下:
withtas ( selectFA.attr_Id,FA.attr_Name,CDF.col_Id,CDF.sortfromT_FilterAttributesasFA innerjoindbo.RF_FilterCategory_TFilterAttributesasDFonFA.attr_Id=DF.attr_Id innerjoindbo.RF_Columns_FilterCategory_FilterAttributesasCDFonCDF.df_Id=DF.df_IdandCDF.col_Id='14' ) selectt.attr_Id,t.attr_Namefromt innerjoindbo.RF_FilterCategory_TFilterAttributesasDFont.attr_Id=DF.attr_Id innerjoindbo.T_FilterCategoryasFConDF.fc_Id=FC.fc_IdandFC.fc_Idin ( selectfc.fc_IdfromT_Columnsastc innerjoindbo.RF_Columns_FilterCategoryascdcontc.col_Id=cdc.col_Id innerjoinT_FilterCategoryasfconcdc.fc_Id=fc.fc_Id14wheretc.col_Id=' ' ) 16orderbyt.sort
然后就得到如下所有手机类别下的“筛选条件“对应的”筛选条件值“,如下图:
原文链接:https://77isp.com/post/6861.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2023-01-07
网站技术 2022-11-26
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
小游客游戏攻略网游戏攻略网 2024年07月26日
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
扫码二维码
获取最新动态