摘要: 目标:限定列的有效值,即字典库反模式: 1、在列定义上指定可选值 create table Bugs(status varchar(20) check(status in('new','in progress','fixed')))。 2、使用触发器 还有使用域或者用户自定义类型(UDT)等方法。 缺点: 1、无法获取所有的值,无能用select distinct status from Bugs,因为可能有的status目前还没有存储。 维护不好的话,还有可能造成列表和数据库存储的值,不一致。 2、增加一个值,需要修改数据库定义或者触发器。 3 阅读全文
posted @ 2012-05-07 09:56 日暮乡关何处是 阅读(403) 评论(0) 推荐(0) 编辑
摘要: 目标:使用小数取代整数反模式:使用float float类型是使用二进制格式编码实数数据。并不是所有的十进制数都能用二进制存储,所以浮点数通常是舍入到了一个非常接近的值。 比如: select rate from A where id=123 --Result:59.95 select * from A where rate=59.95 --Result:empty set;no rows match. select * from A where ABS(rate-59.95)<0.000001 --这个才能正确查出数据!识别反模式: 使用float、real。合理使用反模式: ... 阅读全文
posted @ 2012-05-07 09:12 日暮乡关何处是 阅读(338) 评论(0) 推荐(0) 编辑
摘要: 目标:支持可扩展性(随着数据增长,怎样提升查询性能)反模式:分表、分列(将一个列拆分成多个子列)。 这样会产生问题:不断产生新表,管理数据完整性(不同的表定义不同的约束),输入插入错误后不好修复,管理引用完整性(涉及多个表),标识元数据分裂列解决方案: 使用水平分区、垂直分区。这方面不同数据库有不同的实现。sqlserver的水平分区方法:http://jackyxfl.blog.163.com/blog/static/1641341502010921483086/ 解决元数据分裂的改进方法就是创建关联表。这一章写的不好,因为我昨天实验sqlserver的水平分区,但是没搞定,以前公司也... 阅读全文
posted @ 2012-05-06 23:20 日暮乡关何处是 阅读(330) 评论(1) 推荐(0) 编辑
摘要: 目标:存储多值属性反模式:创建多个列。比如产品主图,开始需求是,每个产品都是3张图,但随着时间的推移,可能就不止3张了。 1、查询:多个列的话,查询时可能不得不用IN,或者多个OR 2、添加、删除、确保唯一性、判断是否有值:这些都很麻烦 3、字段总会不够用的合理使用反模式: 有时候,一个属性可能最多就有N个值,并且他们的存储位置和顺序都是固定的。这样的话,可以使用反模式。解决方案: 创建从属表建议:同样意义的值应该存在同一列中。 阅读全文
posted @ 2012-05-05 21:10 日暮乡关何处是 阅读(309) 评论(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 日暮乡关何处是 阅读(836) 评论(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 日暮乡关何处是 阅读(1395) 评论(1) 推荐(0) 编辑
摘要: 目标:简化数据库架构反模式:不使用约束 1、假设代码永远正确。每次录入的时候确保值有效,删除时确保所有相关表都背合理的更新。 2、检查错误。每次使用前都要判断值的有效性。识别反模式: 怎么判断我的值有效(在另一个表中存在)。解决方案: 使用约束,并使用级联更新 个人经验:用EF的时候,外键让我很头疼,我曾发誓以后不再用约束。 阅读全文
posted @ 2012-05-04 19:16 日暮乡关何处是 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 目标:建立主键规范反模式:每张表都有一个伪主键id 1、如果存在一个逻辑上更为自然的主键并且也满足unique约束,那么id就多余了。 2、伪主键本身确保了表的数据不会存在重复项,所以也就无法避免表中的其它数据出现重复项。 3、主键名应该便于理解,所以建议用XxxID,而不都是用ID。 4、使用组合键。解决方案: 1、用更清晰的XxxID,而不是用ID 2、拥抱自然键和组合键。如果已经有一列能确保唯一、非空的记录,就不必使用为主键。合适的时候可以使用组合键。 阅读全文
posted @ 2012-05-03 23:08 日暮乡关何处是 阅读(353) 评论(1) 推荐(0) 编辑
摘要: 这一章的“嵌套集”和“闭包表”,我赶脚着比较麻烦不实用,所以也就不细究了。目标:分层存储与查询,比如地域字典表的存储反模式:邻接表(总是依赖父节点) 邻接表维护树比较方便,但是查询很笨拙,如果要找一个节点下的所有子节点,要关联很多次,这个关联次数取决于树的深度,所以,邻接表不能用于存储比较深的树。识别反模式: 我们的书一共有几层?合理使用反模式: 如果树结构不深,可以用。解决方案: 路径枚举: 用一个path保存所有祖先的完整路径。 优点:查询方便; 缺点:1、不能保证存储的值的有效性。2、增、删时,要考虑对原位置下的子节点如何处理,比较麻烦。3、如果还要维护一个排序... 阅读全文
posted @ 2012-05-03 08:01 日暮乡关何处是 阅读(672) 评论(0) 推荐(0) 编辑
摘要: 目标:存储多值属性,即:多对一反模式:多个值保存在一个字段内。称为:乱穿马路 比如:BookTags表(书和分类的关系表,一本书属于多个分类) 1、查询:查询某个分类的书。只能用正则或者like了,索引将不可用。 2、关联查询:查询某个书的所有分类名称,简单sql已经无法实现。 3、修改、删除:修改或删除一个分类时,必须先保存之前的,再修改或删除。 4、合法性验证:保存的内容的合法性,无法保证。 5、多值之间需要用分隔符。 6、字段的长度限制会影响分类数量。识别反模式:出现以下现象,则说明已经乱穿马路了。 1、保存的值有数量限制(具体多少个需要根据字段长度和值的长度进行计算) ... 阅读全文
posted @ 2012-05-02 19:28 日暮乡关何处是 阅读(1452) 评论(1) 推荐(1) 编辑