最近在公司启动新项目,我记录了组内讨论设计数据库表结构的时候一些思考,如果大佬觉得不对,恳请指出。
以京东为例,手机和空调的规格不一样,手机和手机的规格是一样的,所以不同的种类(分类)的商品,其规格参数不一样,但相同种类的商品,其规格参数一样。那么在设计规格参数的时候,不应该基于商品去设计,而是基于商品的分类来设计。虽然是对商品的操作,但不能基于商品来设计表结构,否则会无穷无尽。
所以,在设计的时候可以一个分类下有一套规格参数,但是相同分类下的不同商品,规格参数的名字虽然一样,但规格参数的值是不一样的。
刚刚分析得出要基于分类设计,结果发现不同商品参数不一样,这该如何设计?此时,key和值就应该分开保存,并且是两张不同的表,如果放到一个表里, 这个规格就不可能跟商品分类进行绑定,而只能跟商品进行绑定,因为不同的商品,其规格的值是不同的,如果保存到同一张表,则会出现一个商品一个规格。那么一个规格还是会无穷无尽。
同一分类下的商品规格是一致的,因此,规格商品的key是一样的,值是不一样的,值将来和商品进行绑定,key则和商品分类进行绑定。一个分类下有一套规格参数,而这套规格参数的值是不确定的,一个分类下有N多商品,每个商品的值都是不一样的。
先不管值怎么保存,首先解决的是key如何保存?key和分类绑定,那如何设计这张表?一个分类一张表?这个表的字段将会非常多,因为分类也有几千种,难道要创建几千张表?显然不合适,而且现在是要把分类作为数据进行保存,不是作为字段进行保存,那如何设计?
此时,牵涉到横表和竖表的设计问题。在设计规格参数模板(key)的表时,不能再用传统的横表设计,要使用竖表进行设计。什么意思?规格参数中分为两部分:规格组和组内属性,即一堆的参数合在一起形成一个组,那么在设计时要将组和组内属性单独保存。如果按照传统设计,我们会以规格参数作为数据库字段名,如品牌、型号等都是字段,那么表的字段就会无限多。这样的表称为“横表”。一条信息,描述所有数据。 规格参数越多,表的字段就越多。
一条信息,只描述一条规格属性,也就是把规格参数作为字段的值,而非字段本身。这样的设计的表成为“竖表”。
不过,规格和规格组也要单独保存,都采用竖表设计。所以我们有两张表:
规格组:tb_spec_group(一个商品分类下有多个规格组)
规格参数:tb_spec_param(一个规格租下有多个规格参数)
也即面向对象的角度看表结构设计:现在要去表示规格的key,那规格参数的这些参数,如果要用Java对象的形式表示,如何表示?首先分成组合组内两部分:
组是一类事物,组内参数也是一类事物,
在描述组的事物的时候,就设计一个类:组的名就叫做group
class Group{
Long id;
Long cid;
String name;
List<Param> params;
}
class Param{
Long id;
Long group_id;
String name;
boolean numeric;
String unit;
boolean isSearching;
String segments;
}
未完待续。。。