欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

数据库设计-物品分类-方法选择解决办法

更新时间: 2014-01-05 02:31:05 责任编辑: Author_N1

 

数据库设计-物品分类-方法选择
假设有这么一个需求:保存所有物品信息,保存所有物品分类信息;其中一个物品可能属于多个分类,而且假设类别数和物品品种数都有增加的需求,但作用主要是用于查询,增加和修改的情况很少。
方法一:建一个类别表[类ID,类名,父类ID],再建一个物品明细表[物品id,物品名,类别],由于要处理一个物品属于多个种类,因此类别字段设置成[#类编号1#,#类编号2#]文本。
方法二:建立一个类别表[类ID,类名],再建立一个物品明细表[物品id,物品名],还要建立一个表保存物品属于哪个分类[分类ID,分类名,物品ID],这个表一条记录表示一个关系,可以保存物品和分类的多对多关系。

比较:
1 方法一可以表示类的子类,方法二如果加一个父类ID也能实现效果,因此无区别;
2 方法一如果要列出某一类的物品需要用LIKE语句,但是同时还可以列出其他的物品属性,
  方法二如果要列出某一类的物品不需要用LIKE语句,但是只能列出ID,如果要列其他属性还需要查第二个表;
3 方法一列出某物所属的类别只需要一条SELECT语句返回一条文本记录,然后需要过滤#号并拆分字符串为类别ID数组
  方法二列出某物所属的类别也只需要一条SELECT语句但是返回多条类别ID记录,同时还可以返回类别名称[冗余/或者另一表保存类的名称]
4 方法一数据基本没有冗余,如果需要提高查询多级分类速度可以保存类别路径,则类既可以包含子类也可以直接包含产品
  方法二如果想减少联合查询,则需要设置冗余字段保存分类名,也可以保存类别路径提高查询多级分类速度同时实现类包含类的同时还包含子类

如何取舍:
1 为何要分类?
  分类是为了能够实现批量处理。如果没有批量处理的需求,则无需分类。如果分类数上万(两种方法都支持),物品数也上万(两种方法都支持),而关系复杂程度适中(两种方法都支持),则方法一是两个表,一个长字段表示分类,方法二是三个表,其中一个表表示分类情况,总的数据量要稍微大一些。
2 分类的复杂程度
  实际应用中物品的分类是比较简单的,但是在统计时往往要依据另外的方式来分类统计,比如平时使用成品功能来分类,而某些时候需要按原料、客户、付款方式等进行分类,此时第二种方式灵活了许多,但方法也复杂一些,但是方法一也能实现,相比复杂程度也差不多。
3 方法一可以使用在绝大多数情况下,可以一次查询出所需要的信息,但是扩充的是文本字段长度,容量不宜太大,而且查询效率偏低;方法二也可以使用在绝大多数情况下,扩充的是记录数,查询速度快,容量无限制,但是如果要查询较为详细的信息则需要联合多个表来查询。
4 如果两种方法结合,会怎么样?
  如果最常用的分类使用方法一来表示,并且类别字段只保存一个主要类别ID,则查询时就不需要LIKE了。避免了第一种方法的缺陷。
  我们注意到这两种情况下都有一个类别表而且可以是相同的,因此其他的分类情况就使用第二种方法来表示,用来实现不常用的一些分类应用,由于不常用,而又非常灵活,因此在性能上影响不大。
5 但是问题又来了:如果我想知道某一分类情况,那我到底是只查主类别(快速),还是同时查询扩展类别(较慢)?如果我用一个辅助字段来表示是否具有扩展类别属性(数字,表示扩展类别个数),则相比方法一是不是又多了一些额外的空间和步骤?

--参考方法--
物品id,物品名,其他信息。。。
物品id,类别
有多少个类别就建多少条记录 
例如:
物品id,类别
001 1
001 2
都这一点数据对数据库来说,不算什么,这个是随着物品的增加而增加,
幅度不会很大
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:31:05
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/10831/
本文WWW.DOC100.NET DOC100.NET版权所有。