摘要: 目标:存储多值属性反模式:创建多个列。比如产品主图,开始需求是,每个产品都是3张图,但随着时间的推移,可能就不止3张了。 1、查询:多个列的话,查询时可能不得不用IN,或者多个OR 2、添加、删除、确保唯一性、判断是否有值:这些都很麻烦 3、字段总会不够用的合理使用反模式: 有时候,一个属性可能最多就有N个值,并且他们的存储位置和顺序都是固定的。这样的话,可以使用反模式。解决方案: 创建从属表建议:同样意义的值应该存在同一列中。 阅读全文
posted @ 2012-05-05 21:10 日暮乡关何处是 阅读(312) 评论(1) 推荐(0)
摘要: 目标:引用多个父表反模式:使用多用途外键。这种设计也叫做多态关联,或者杂乱关联。 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的。 一条记录,要么是存储的X,要么是存储的Y。X、Y可能是有关联的,也可能是完全无关的。 例如:select * from a left join b on a.xid=b.id and a.xType='b' lefe join c on a.xid=c.id and a.xType='c'识别反模式: 1、用这种方式,可以和任何表关联。 2、我们的数据库设计不能声明外键。 3、有一个列,是专门用来说明其它列是和什 阅读全文
posted @ 2012-05-05 20:55 日暮乡关何处是 阅读(847) 评论(1) 推荐(0)
摘要: 目标:支持可变的属性反模式:使用泛型属性表。这种设计成为实体-属性-值(EAV),也可叫做开放架构、名-值对 这种设计,在增加属性的时候,不需要给表增加字段,只需要多插入一条EAV记录即可,优点有: 1、表的字段比较少。 2、新增属性,不需要动表结构。 3、不会出现有的字段存储的是空值的问题。 但是,缺点有: 1、查询语句啰嗦,比如:select sttr_value as gender from XAttrs where attr_name='gander' 2、无法保障数据完整性。 3、无法声明强制属性,因为无法定义not null属性。 4、无法使用SQL的数据类型,比. 阅读全文
posted @ 2012-05-05 19:21 日暮乡关何处是 阅读(1410) 评论(1) 推荐(0)