如此奇怪的数据库设计,CSDN上不得解决

周睿 发布于 2010/01/19 09:13
阅读 985
收藏 1

是这样的,有三个表

产品类别,产品系列,产品

产品类别表: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不为空

TabTab

Tab表字段

字段类型

字段长度

字段描述

字段是否为空

tId

Int

4

主键唯一标示

不能为空

pId

Int

4

关联产品

不能为空

tabTitle

Varchar

10

Tab头部名称

不能为空

tabInfo

Text

16

Tab内容

不能为空

isShow

Bit

1

是否显示

默认显示1

tabIndex

Int

4

排序显示

默认为0

上述表中有没不合理的?

要求:还有资料,下载等等表,要能和产品,系列,类别关联,这个到底和谁关联,是由用户来确定的,

这几个表怎么来设计,2,系列表要有一个相关系列,意思是我查出一个系列要能显示它的相关系列,

我目前是用描述父子关系来描述这种关系的,不知道合不合理,请人告诉下,我没什么经验

加载中
0
周睿
周睿
  1. 有没人出点主意的?
0
y
yukon12345

首先,觉得最好不要用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了。产品表根本不用改。

 

 

 

0
lds
lds

楼上分析的已经很清晰了!

0
周睿
周睿

产品分类表:p_class

pc_id

pc_name

father_id

isshow

产品分类表如此设计会出现效率问题,我开始的想法是,id smallID

                                                                                  1     ,1,2,

                                                                                  2      ,2,

0
周睿
周睿

引用来自“周睿”的帖子

产品分类表:p_class

pc_id

pc_name

father_id

isshow

产品分类表如此设计会出现效率问题,我开始的想法是,id smallID

                                                                                  1     ,1,2,

                                                                                  2      ,2,

0
y
yukon12345

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:求人不如求己。

0
周睿
周睿

你查找父类需要用到递归,但是我查找父类就不需要,我开始也是像你这样设计的,但是这样来,我发现效率很低下,

因为递归的原因

0
周睿
周睿

当层级特别多的时候,速度会非常的慢,不知对不对

0
红薯
红薯

关于递归的问题,性能最好的做法是一次性load出所有数据(不包括产品),然后在代码中处理递归的过程。

0
周睿
周睿

那红薯认为如何来设计数据库??代码中如何处理,请明示

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部