论坛首页 综合技术论坛

复杂商品分类的表如何建立?

浏览 31678 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-10-12  
xmldb的查询 存储都和关系数据库不同  可以参考xquery xupdate

基本不用为数据格式发愁 怎么保存都可以 做结构错了再改都来得急  不象关系数据库和对象那么死板. 说百了就是文档 可以随便写 只要自己知道是什么意思就可以.
0 请登录后投票
   发表时间:2006-10-12  
zww80216 写道
复杂商品的分类,类似淘宝的分类
1.每类商品有无限级分类
2.每个商品可能会有交叉分类
3.每类商品的扩展属性不一样
比如:
夹克的扩展属性为
款式: 拉链夹克 风格: 休闲 品牌: other/其它 适合季节: 春秋 尺码: M L 颜色: 其它颜色 质地: 纯棉
主板的扩展属性为
品牌: 微星/MSI 类型: Socket478 芯片组: Intel 845 平台类型: Intel平台 宝贝成色: 8成新

这些扩展属性都会动态的变化

那么问题来了:
1.全文搜索如何合理建立?
2.可能后台扩展属性表是否需要动态建立?
3.如果单件商品属于交叉分类的话,查询结果记录重复是否需要?
4.高效的无限级分类算法大家可否指点一二,这个困惑了我很久了?

不求完整解决,给个思路也成


你的问题很多,分别回答。
1.无限分类。树形结构,一般可以认为分类变化的频度很低,所以比较适合于损失插入修改性能以提高查询性能。
树形结构的查询,一般最关心和最区别于普通字典数据的地方就是查询子树问题,在Oracle里对应hierarchical query,即使用connect by语句的递归查询。子树举例说:生物分类中,给出所有的鸟类。
一般的树形结构在表里的物理存储方式有两大类:
1.链表方式。
  有各种变形,典型的如,一条记录有唯一id,还有parentId保存父节点的ID。查询子树时需要用SQL递归查询,需要多条SQL。
2.ID即是节点在树中的路径。
  比如生物id为001,哺乳动物则为001001,鸟类为001002,前三位是父节点的id,后三位是在本级中节点的ID。依此类推。
  这种方案有每级节点数量的限制,因此有其他方案来弥补,比如另设一个字段保存上级节点的ID,这样本级节点的长度实际上是算出来的,而不是固定的。但这些方案的共同点就是,对子树问题,都采取id like '父节点%'的方式,只需一句SQL,但是like的效率并不算很高。
3.Nested Sets方式。
  用两个字段保存树形结构关系,left数和right数,规则是:子的left>父的left,子的right<父的right。这种算法专门针对子树问题优化,根据上述规则,它只需要where left>currentNode.left and right<currentNode.right即可。因为left,right都是数字,所以可以利用索引,可以想见,查询的速度非常快,比用Oracle 的connect by实现内部递归的方式更快。
  具体参考:http://www.developersdex.com/gurus/articles/112.asp
 
 
0 请登录后投票
   发表时间:2006-10-12  
交叉分类一般还是采用关系表比较好,即表字段为Id,分类id,商品id,这样一个商品可以有多个分类。

查询的时候我认为不应该显示重复的记录,即便有交叉分类SQL查询中也可以使用第distinct 关键字过滤掉。
0 请登录后投票
   发表时间:2006-10-12  
对于扩展属性的问题,一般有如下几种方案:
1.采用XML字段存储。Oracle10,DB2 9等最新版的数据库对xml字段有良好的支持,可以不用全部加载xml即可查询xml的内容。
2.采用一个扩展属性表。字段为ID,商品ID(或分类ID),属性名,属性值(使用String类型比较通用)。
  当然还可以有其他细节的变通和优化,比如opensymphony的property-set里处理的那样。
  这个方案的问题是查询效率问题,这个表也许会非常大,需要仔细调优。
3.动态建立属性表。
  应该对一个类型建立一个表。对于高性能上是一个方案,不过对于开发来说,会有很多问题要处理,比如增删属性字段的问题,你要同时保留原有数据。
0 请登录后投票
   发表时间:2006-10-12  
全文检索问题我不是很清楚,可能要根据你前面采取的不同的方案来处理。
有时候可能不需要真正的全文检索吧,也许采取SQL模拟的方式也可以,比如 properyA like 'xxx' or propertyB like 'xxx'...
0 请登录后投票
   发表时间:2006-10-12  
zww80216 写道
xml确实是一种解决的办法,tianxinet的子表方法有点繁琐了,扩展属性有很多表也带来了维护的困难性了。。如果像淘宝的商品分类那样的话,你的子表数量是很惊人的。。。。
继续关注中


确实复杂了。不过用XML恐怕也不能很好的解决,在表达数据存储以及数据关联方面,XML的能力超不过RDB。换句话说,如果RDB都解决不了的数据存储和关联问题,XML也解决不了,呵呵。

buaawhl 写道

...
XML 对于 Relational Table 的优势,就是可以直接嵌入复合属性数据。...

这个XML不比RDB有优势,比如Oracle的“对象类型”、“对象表”,也可嵌入复合属性数据。Oracle还可以创建XML Type表。

zww80216 或许可以试一下XML DB(XML 和 RDB 的结合),oracle 支持这个东东。

http://www.oracle.com/technology/oramag/oracle/05-sep/o55xml.html

XML to Relational: Bridging the Gap
By Sean Dillon

Storing XML in traditional relational storage

XML is a great way to share data between systems, organizations, and disparate technologies, but once you've received that XML, what do you do with it? In this column, I review how you can store the contents of your XML documents in relational tables.
...
0 请登录后投票
   发表时间:2006-10-12  

Oracle的“对象类型”、“对象表”,也可嵌入复合属性数据.

已经超出 relational table 了,属于 OODB 的特性了。
0 请登录后投票
   发表时间:2006-10-12  
"不过用XML恐怕也不能很好的解决,在表达数据存储以及数据关联方面,XML的能力超不过RDB。换句话说,如果RDB都解决不了的数据存储和关联问题,XML也解决不了,呵呵。"

为什么RDB要关联 ? 

用xml db不用考虑这个问题 因为只有RDB才需要关联 .

用惯了RDB的开发人员 习惯了RDB的设计思想 想用RDB的设计去套xmldb. 其实技术变了 数据库的设计思想也随之而变.

就象函数编程的高手不习惯类编程 OO编程的高手不相信XML能取而代之  
0 请登录后投票
   发表时间:2006-10-13  
buaawhl 写道

Oracle的“对象类型”、“对象表”,也可嵌入复合属性数据.

已经超出 relational table 了,属于 OODB 的特性了。


嗯,buaawhl的用语更精确--relational table。relational和OO也并不互斥,比如ORDB,具备relational、OO双重特性。
至于Oracle中的OO特性,我一直都当作ORDB特性,或者说对象型关系数据库特性。

我的意思是说RDB产品可以实现XML实现的所有功能,oracle可以,sybase、DB2也可以,不管是否具备OO特性(其实都具备),它还是RDBMS。

解释一下表述上的差异
0 请登录后投票
   发表时间:2006-10-13  
winterwolf 写道
"不过用XML恐怕也不能很好的解决,在表达数据存储以及数据关联方面,XML的能力超不过RDB。换句话说,如果RDB都解决不了的数据存储和关联问题,XML也解决不了,呵呵。"

为什么RDB要关联 ? 

用xml db不用考虑这个问题 因为只有RDB才需要关联 .

用惯了RDB的开发人员 习惯了RDB的设计思想 想用RDB的设计去套xmldb. 其实技术变了 数据库的设计思想也随之而变.

就象函数编程的高手不习惯类编程 OO编程的高手不相信XML能取而代之  


注意我提的思路,Oracle是一种RDB产品,RDBMS,但它具备xml db特性。现在还没有一种单纯的xml db成为主流应用。所以只能推荐一种RDBMS了。至于关联,楼主给定的场景中数据肯定是存在关联的,不管是不是用RDB存储并在table间建立relation
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics