|
发布日期:2004-9-23
主题作者:User_hj(微软最有价值专家)
摘 要:分类技术的实现到底要考虑些什么的讨论
正 文:
一、问题的提出:
很多地方都需要用到分类技术,比如说商品分类、客户分类。本人认为,分类的关键在于数据库结构的设计上。不知道各位是否同意。那么数据库结构的设计上到底要考虑些什么呢?
二、主题的总结:
具体的做法可以是这样的。
1.重新排序:
第一步.我们可以采用字段“ORDERID”来存放一个数值。加入新类别时,可以通过DMAX来将此字段置为最大。在用treeview显示时,就可以通过对此字段的排序显示。 第二步.当我们需要重新排序时,只需要通过更换各个类别的“ORDERID”值,就可以实现次序任意重排了。 如果我们需要将某级类别按照名称或者编号重排,也可以先按照名称或编号排序,然后按次更新“ORDERID”,即可实现按业务规则排序的目的。
2.重新归类:
重新归类的办法是更改该类别的父类别字段(ParentID)内容,以指向新的父类别。但是应当注意的是,如果我们的类别ID是与父类别有关的话,我们就需要同时更改该类别的ID。一般来讲修改ID是不太可取的。所以类别的ID应该采用“自动编号”,而另立“路径”字段(Path)来记录它的各级上层ID。 这样,问题就可以从修改ID,变为修改Path。
3.如何能够统计任意某个类别下面的数据:
将统计表与类别表进行Join,是的每条明细记录都有字段Path.用Like语句将Path中含有所要类别的ID的记录筛选出来进行汇总即可。
4.所有报表都可按分类次序排序:
可以在类别表中再增加一个字段(TotalOrderID),在每次重新排序和归类后都可对此字段进行全表调整。这个程序需要嵌套计算。 这样,当统计报表时,只需通过Join语句让每个汇总记录都有TotalOrderID,对此字段排序,就可以实现所要的排序了。
至于提出的既可以属于类别A,又可以属于类别B。我认为这是用户在分类表述时的逻辑错误。比如“罗技音响”。用户既想分在“罗技”下面,又想分在“音响”下面。这实际上是两种分类原则(既想按“厂商”,又想按“性质”来分)。而每一种分类方法只能尊从一个分类原则(否则统计时就会出现重复记帐的问题)。因此,问题就转化成我们能否提供两种(甚至多种)分类方法。问题的解决有两种办法:
办法一:仍然只提供一种分类方法。通过附加字段来存储用户所说的第二套分类原则。而该字段不实现treeview式显示。和一般属性一样进行汇总。
办法二:在类别表中增加字段“SetNumb”。该字段可以用来区分多套分类方式。但在我们增加新类别时,总是增加在SetNumb=1的那套分类方式下。SetNumb为其他方式的分类方式,我们将通过在这些方式下的重新归类完成。
欢迎大家继续讨论,发表自己的观点!
三、主题的讨论:
请前往论坛这个帖子:cgi-bin/dispbbs.asp?boardid=90&id=2152
|