是这样的,有三个表
产品类别,产品系列,产品
产品类别表:pClass
产品类别字段 |
字段类型 |
字段长度 |
字段描述 |
字段是否为空 |
pCId |
Int |
4 |
主键唯一标示 |
不能为空 |
pCName |
Varchar |
255 |
产品类别名称 |
不能为空 |
pCInfo |
Varchar |
255 |
产品类别描述 |
可以为空 |
pSmallClass |
Varchar |
1000 |
描述父子关系 |
不可以为空 |
pIndex |
Int |
4 |
排序显示 |
默认为0,不为空 |
isShow |
Bit |
1 |
是否隐藏 |
0隐藏1显示 |
产品系列表:productSeries
产品系列字段 |
字段类型 |
字段长度 |
字段描述 |
字段是否为空 |
pSid |
Int |
4 |
主键唯一标示 |
不能为空 |
pSname |
Varchar |
255 |
产品系列名 |
不能为空 |
pSInfo |
Varchar |
255 |
产品系列描述 |
可以为空 |
pCid |
Int |
4 |
类别ID |
不可以为空 |
pId |
Int |
4 |
产品ID |
不可以为空 |
pSmallSeries |
Int |
4 |
描述朋友关系 |
不可以为空 |
pSIndex |
Int |
4 |
排序显示 |
默认为0不为空 |
isShow |
Bit |
1 |
是否隐藏 |
0隐藏1显示 |
产品表product
产品系列字段 |
字段类型 |
字段长度 |
字段描述 |
字段是否为空 |
pId |
Int |
4 |
主键唯一标示 |
不能为空 |
pName |
Varchar |
255 |
产品名称 |
不能为空 |
pInfo |
Varchar |
255 |
产品描述 |
不能为空 |
pPrice |
Money |
8 |
产品价格 |
可以为空,为空不显示产品价格 |
pImages |
Varchar |
255 |
产品图片 |
不能为空,存路径, |
pAlt |
Varchar |
1000 |
产品图片说明 |
可以为空 |
pFrom |
Varchar |
255 |
产品自造商 |
为空不显示, |
pDate |
DateTime |
8 |
产品日期 |
默认(getdate()) |
pTitle |
Varchar |
255 |
产品头部名称 |
可以为空 |
pDes |
Varchar |
255 |
网页优化描述 |
可以为空 |
pKey |
Varchar |
255 |
网页优化关键字 |
可以为空 |
pIndex |
Int |
4 |
排序显示 |
默认为0不为空 |
Tab表Tab
Tab表字段 |
字段类型 |
字段长度 |
字段描述 |
字段是否为空 |
tId |
Int |
4 |
主键唯一标示 |
不能为空 |
pId |
Int |
4 |
关联产品 |
不能为空 |
tabTitle |
Varchar |
10 |
Tab头部名称 |
不能为空 |
tabInfo |
Text |
16 |
Tab内容 |
不能为空 |
isShow |
Bit |
1 |
是否显示 |
默认显示1 |
tabIndex |
Int |
4 |
排序显示 |
默认为0 |
上述表中有没不合理的?
要求:还有资料,下载等等表,要能和产品,系列,类别关联,这个到底和谁关联,是由用户来确定的,
这几个表怎么来设计,2,系列表要有一个相关系列,意思是我查出一个系列要能显示它的相关系列,
我目前是用描述父子关系来描述这种关系的,不知道合不合理,请人告诉下,我没什么经验
首先,觉得最好不要用smallclass来表示他的子类,应该用fatherid之类的来表示他的父类ID.
顶级产品分类的父ID是0,这样设计的好处是可以做出无限分层分类。便于扩展。
并且知道一个分类之后可以很容易查出他的关系树。
而如果你用smallclass来代表儿子的名字,会出现这一种情况:父类下有3个子类,smallclass怎么表示??一起写在smallclass里面?相应的3个子类的父亲如何找??
isshow:你在产品表,产品分类表,产品系列表里都设定上isshow,进过项目的一系列的操作修改,肯定会有数据冲突。因为有数据冗余。
建议:将produtct表中的isshow改为所需权重数(priority)比如值3。
权限越高权重数越低。最高权限为0(为了无限划分权限)用户访问时,按照设计赋予一个访问权重,如果被赋予的权重比表中的小,就可以查看。
不要觉得这样麻烦,其实就算你的网站暂时无权限划分,不需要登录功能时候,只要把任何用户的访问权重值设置成1,然后产品显示时候所需访问权限设置0时,用户访问不到,设置成1或大于1就能访问。这一点点,就可以为以后网站的扩展打下基础。这样做能有效划分各访问限制。而不是单纯的按isshow的真假来是否对某人显示商品。
我建议的表设计:(只写出主要字段,info,index什么的可以自己加)
产品分类表:p_class
pc_id
pc_name
father_id
isshow
产品分类表:p_serial
ps_id
ps_name
father_id
isshow
产品联系表(和产品分类联系):p_class_relation
p_id
pc_id
产品联系表(和产品系列联系):p_serial_relation
p_id
ps_id
产品表:只要加一个priority字段就可以
这样设计的话就算以后再来个什么产品分类2,系列2,只要加上2个表就可以又划分出一类产品分类2了。产品表根本不用改。
楼上分析的已经很清晰了!
产品分类表:p_class
pc_id
pc_name
father_id
isshow
产品分类表如此设计会出现效率问题,我开始的想法是,id smallID
1 ,1,2,
2 ,2,
引用来自“周睿”的帖子
产品分类表:p_class
pc_id
pc_name
father_id
isshow
产品分类表如此设计会出现效率问题,我开始的想法是,id smallID
1 ,1,2,
2 ,2,
no,你这样做才会有效率问题。我说的方法是实现分层时公认的方法。实际操作时候想找某个产品分类的子类只要
select *from p_class where father_id=某分类自己的pcid. 即可返回一个包含所有子分类的数据源table(asp.net)或者array(php),方便查找。找自己父类更方便了。
而你用smallID,找子类返回的是1,2,3,4一个字符段,然后必须split划分成数组,再分别用pcid=1,pcid=2 。。。一个一个找到子类数据项。这样就会有效率问题。
找它的父类,必须在smallID列里用
where smallID like %,自己的id,%
找到含有自己id的字段,效率也是低下。
建议:下几个有名的程序多看看别人怎么设计。
实际设计时候还必须考虑范式。一般小网站设计能到2范式就不错了。 大型系统要3范式,bc范式要看情况,另外一律存储过程。
建议:找本数据库原理看看。
ps:求人不如求己。
你查找父类需要用到递归,但是我查找父类就不需要,我开始也是像你这样设计的,但是这样来,我发现效率很低下,
因为递归的原因
当层级特别多的时候,速度会非常的慢,不知对不对
关于递归的问题,性能最好的做法是一次性load出所有数据(不包括产品),然后在代码中处理递归的过程。
那红薯认为如何来设计数据库??代码中如何处理,请明示