日期:2014-05-16  浏览次数:20959 次

一个类似京东的数据库设计问题
http://www.360buy.com/products/1620-1621-1626-0-0-0-0-0-0-0-1-1-1.html
这是京东的产品页

京东的产品属性分为
第一种 一种是主分类 例如: 首页 > 家居、厨具、家装 > 家纺 > 床品件套 

第二种 是下面的 商品筛选 有类别 品牌 规格 价格 这些可以交叉查询

我分类设计成2张表 一张是主表 保存主分类 另外一张表是辅助表 保存 辅助分类的(就是类别 品牌 规格等东西)

在输入产品的时候 主表的数据可以保存到属性表 采用线性设计 
ID 产品ID 分类ID 前台搜索该分类下面的产品的时候 是没问题的 

而辅助分类表的属性保存就麻烦了
采用分字段设计 肯定是行不通的,只有采用线性设计 不如有该页面的品牌 富安娜 类别的 三件套 
数据库设计

ID 产品ID 辅助分类ID

再前台查询的时候 根据主分类毕竟容易 可以直接在主属性表里面查询分类ID就可以得到要找的产品

当涉及到辅助分类交叉查询的时候就犯难了,不知道怎么查询了 

先根据主表查询主分类ID 得到所有产品列表 再根据这些列表查询辅助分类属性表 交叉 如果同时满足 富安娜 三件套 

那么就必需满足 产品=床品套件 品牌=富安娜 类别=三件套

 难道这样查询 产品主分类ID=床品套件 然后 辅助分类ID in(富安娜,三件套) ? 

或者辅助分类表和主分类表合并成一张表

直接 分类ID in(床品套件,富安娜,三件套)? 

这时就糊涂了 想不通了 模糊的感觉 这样查询都是错误的

------解决方案--------------------
表:
1:类表表 A
2:品牌表 B
3:规格表 C
......
10:工艺表
11:产品表(类别ID,品牌ID,规格ID)F

查询
select a.name,b.name,c.name from F inner join A on F.类别ID=A.类别ID inner join b on .....

我觉得应该是这样设计的。
ID作为主键关联,多表查询效率也不会很差。
------解决方案--------------------
类别 品牌 规格

这是3个表,表里面有多少记录,就没关系了吧。
类别多,表还是一个,只是多一条记录而已。
------解决方案--------------------
楼主说的两张表想把数据全部管理起来肯定不行.我估计也是会按产品种类,品牌,型号,价格等多个表的设计.我的体会是设计越简单,查询条件会越复杂;设计越复杂,查询起来逻辑反而简单.至于效率,在逻辑清楚的情况下再做考虑,因为首先保证你对查询需求的正确理解------即查出正确的结果是最重要的.
------解决方案--------------------
探讨
类别 品牌 规格

这是3个表,表里面有多少记录,就没关系了吧。
类别多,表还是一个,只是多一条记录而已。

------解决方案--------------------
lz好像把商品的分类与商品的属性混淆了。举个例子:

商品的分类如下:
<xml>
<one id="01 000 000" attr="图书、音像">
<two id="01 001 000" attr="音像">
<three id="01 001 001" attr="音乐"></three>
<three id="01 001 002" attr="影视"></three>
<three id="01 001 003" attr="教育音像"></three>
</two>
<two id="01 002 000" attr="文艺">
...
</two>
</one>
<one id="02 000 000" attr="手机数码">
...
</one>
<one id="03 000 000" attr="家用电器、汽车用品">
...
</one>
...
</xml>

假设id长度为8,前两位表示第一级菜单,中间3位表示第二级菜单,后面3位最后级菜单

就拿床上4件套来举例,商品本身的属性有:
品牌,价格,风格,工艺,...等.
这些属性也可以用xml来表示,比如价格:
<xml>
<element>1-99</element>
<element>100-199</element>
<element>200-299</element>
<element>300-399</element>
....
<xml>

如果床上4件套分类菜单时的id是 09 021 039
将所有分类和此分类包含的商品属性做关联,
那我通过039这个尾号就可以找到所有此类商品的所有属性了。