- 浏览: 753284 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
a offset: 26b offset: 24c offse ...
java jvm字节占用空间分析 -
ls0609:
语音实现在线听书http://blog.csdn.net/ls ...
Android 语音输入API使用 -
wangli61289:
http://viralpatel-net-tutorials ...
Android 语音输入API使用 -
zxjlwt:
学习了素人派http://surenpi.com
velocity宏加载顺序 -
tt5753:
谢啦........
Lucene的IndexWriter初始化时的LockObtainFailedException的解决方法
第二章:乱穿马路
2.1 目标:存储多值属性
2.2 反模式:格式化的逗号分隔列表 模糊匹配无法使用索引,影响性能;多表关联麻烦,却极大影响性能;执行聚合查询不方便开发和调试;更新某个字段值必须执行两次;字段内容出错数据很难恢复修正;选择一个用不用到的分隔符,无法确认不适用;列表长度限制;
2.3 解决方案:创建一张交叉表,实现两张表的多对多的关联
第三章:单纯的树
目标:分层存储和查询 案例:文章和评论 每篇文章有多篇评论,每个评论可以引用另外的评论。
反模式: 最简单的解决方案就是在同一张表中存储该评论id的父节点id(parent_id)
邻接表的使用查询:select c1.*,c2.* from comments c1 left outer join comments c2 on c2.parent_id=c1.comment_id,但是这样只能查询两层的数据。如果需要三级,四级,则必须使用更多的邻接表,这种查询当然就无法直接树的无限级扩展了。查询一棵完整的树数据或者评论总数之类的会导致查询数据库的冗余数据。使用邻接表增加更新非常方便,但是删除就涉及到级联了。
解决方案:如果需要能够确认深度,如果只有简单的两层,则用邻接表会很方便。类似的oracle,sql server,db2等支持with语法的递归查询,而mysql,sqlite则还不支持。
其他的树模型:
1.路径枚举 使用一个字段存储该评论的路径比如:评论id为7,则path字段存为:1/4/6/7,跟linux的路径标识一样,标识7的父评论id为6,6的父id为4,4的父id为1,那么查询的时候就可以使用:select * from conments as c where '/1/4/6/7'like c.path || '%';来查询评论7的所有父节点id,同样可以使用select * from conments as c where c.path like; '1/4' || '%';来查询路径为1/4的所有子节点。更新的时候,可以使用mysql的last_insert_id来把一个评论的id加在父评论路径的后面来标识新评论的路径。
2. 嵌套集:使用nsleft和nsright来保存其后代节点id的范围,一个评论id的所有叶子节点是那些评论id大于nsleft,小于nsright。确认(nsleft,commen_id,nsright)需要对树进行一次深度优先遍历。我们可以通过select c2.* from comnents as c1 join comments as c2 on c.nsleft between c1.nsleft and c1.nsright where c1.comment_id =4 来查询id为4的所有子节点。同样也能来查哪些节点包含了节点4.嵌套集不需要保存分层关系,删除一个节点不会有任何影响。不过插入新节点时,需要重新计算父节点,相邻节点等的这两个值。如果数据库更多的来支持简单快速查询,那么嵌套集是比较好的选择。
3.闭包集:重新用一张treepath表来存储树中所有节点的关系。里面有两个字段(ancestor,descendant)来存储祖先-后代关系,包括不是直接的夫子关系信息。比如:1/4/6,那么表中有这几条记录(1,1)(1,4),(1,6)(4,6)。查询评论4的祖先用select c.* from comments as c join treepaths as t on c.comment_id=t.descendant where t.ancestor=4,查询子节点也很简单。如果要插入一条记录,直接insert,然后加上一条自己的引用就可以了,比如查询一条记录为8,父节点为5.insert into treepaths(ancestor,descendant) select t.ancestor,8 from threepaths as t where t.descendant = 5 union all select 8,8.删除更简单,比如删除id为7,则delete from treepaths where descendant=7.如果要删除一个完整的子数,比如删除评论4及对应后代的子树,delete from treepaths where descendant in(select descendant from threepaths where ancestor=4)。
邻接表示最方便的设计,如果数据库支持with或者connect by prior的递归查询,则邻接表查询更高效。枚举路径只管,但是不能确保引用完整性,设计比较脆弱。嵌套集是比较聪明,但是也不能确保引用完整性。闭包表是最通用的设计。使用空间换时间的方法提高性能。
第四章: 需要id
目标:建立主键规范 主键约束应用场景:1.确保一张表中的数据不会出现重复行;2.在查询中引用单独的一行记录;3.支持外键。
伪主键的支持:mysql:AUTO_INCEMENT,SERIAL;oracle:SEQUENCE;sql server,db2 sybase:INDENTITY;SQLite:ROWID
反模式:给每张表都增加一列id,使用显得太过随意。
1.冗余键值 比如一个bugs表中,id跟bug_id有着相似的功能,都是为了唯一的标识一条记录。
2.允许重复值,如果需要其他的组合键 bug_id和product_id在整张表中只出现一次,则需要使用unique约束。但是使用unique约束时,id这一列就变成多余的了。
3.意义不同的关键字:如果关联查询要查询两张表的两个id,则会导致id会覆盖,并且意义不明确。需要使用类似bug_id或者account_id来定位一条记录。
4.使用using关键词。select * from bugx as b join bugsProducts as bp on(b.bug_id=bp.bug_id),sql也支持使用using,连接列名一样的话。select * from bugs join bugsProducts using(bug_id).如果所有表都定义一个叫id的伪主键,则外键的列将不能使用相同的列名,而且只能使用on表达式了。
5.使用组合键之难。写法麻烦,难用。
不能使用当前使用的最大值+1来获得一条新记录的id,并发问题。序列则将运算和事务在逻辑上分离来解决并发问题。
解决方案: 1直接了当的描述设计,使用有意义的主键id列名,比如bug_id。
2.无视id这个伪主键,使用其他字段作为主键。
3.拥抱自然健和组合键。
规范仅仅在它有帮助时才是好的。
第五章 不用钥匙的入口
目标: 简化数据库架构 引用完整性使用外键约束
反模式: 无视约束
1.假设无暇代码 插入时手工检测是否外键所引用的列是否存在,删除时需要合理的更新所有相关表。 在高并发下可能存在问题,如果显示的对整张表加锁,则可能降低并发量。
2.检查错误 通过写外部脚本检测数据异常,所有引用关系的表都需要检测。
3.不是我的错。代码改动需要确保所有点都已修改。
4.进退维谷 更新记录时需要同步更新两章表,但是如果做到同步更新,导致程序员不适用外键。
解决方案:
有些数据库产品不支持外键 MYISAM 那需要另外的解决方案
1.声明约束
2.支持同步修改 外键支持级联更新, on update cascade,on delete restraict
3.系统开销不一定会过度。外键约束确实需要一些开销,但是相比其他选择,显得还是更高效一点。
通过使用约束来帮助数据库防止错误。
第六章 实体-属性-值 EAV
目标:支持可变的属性
反模式:使用泛型属性表
issue(issue_id) issueAttributes(issue_id,attr_name,attrname) 通过另外一张表来支持可扩展的属性,这两张表列少,新增属性不会造成影响,不需要增加列,不会有控制。但是有下列缺陷:
1.查询属性 需要查询某个属性的值时,需要根据issueAttributes根据属性值查询 select issue_id,attri_value from issueAttributes where attr_name='date';查询操作啰嗦不清晰
2.支持数据完整性,放弃很多传统数据库设计原有的好处。
3. 无法声明强制属性。这种设计无法给某一列设置not null等限制。
4.无法使用SQL的数据类型。比如日期列格式多变,导致数据格式比较乱。
5. 无法确保引用完整性。无法只针对某列定义外键约束。如果在issueattribute表中设置外键引用,会应用到所有列上。
6.无法配置属性名。attr_name可以会因为插入记录的不一致行,导致列名不同。
7.重组列。竖表转化为横表方式转化成多列的查询。查询开销很大。
解决方案:模型化子类型
1.单表继承 为所有类型的所有属性都保留一列,大表。同时可以使用一列表示子类型,根据子类型的不同,有些列就不需要填写。不过每增加一个属性,则需要在原有表里增加新的属性列。
但是表的列的数量是有限制的,而且没有任何元信息来记录哪些属性属于哪个子类型。如果子类型很少,以及子类型特殊属性很少,你也需要使用active record模式来访问单表数据库时,单表继承模式是最佳选择。
2.实体表继承。 为每个子类型创建一张单独的表。每个表都包含那些属于鸡肋的共有属性,而包含子类型特殊化的属性。好处在于让你能阻止在一行内存储一些和当前子类型无关的属性。同样,如果将一个新的属性增加到通用属性中,则需要为每个子表都增加一遍。如果不需要考虑子类型需要在所有表中查询,则可以使用视图来关联这些表。当你很少一次性查询所有子类型时,实体继承表设计时最好的选择。
3.类表继承。创建一张基类表,包含所有子类型的公共属性。对于每个子类型,创建一张子表,通过外键于基类表关联。可以通过视图或者级联查询来一次性获取所有的记录,如果某个子类型不具有某个属性时,其值为空。当你经常要查询所有子类型时这个设计是最佳选择。引用这些公共列就行了。
4.半结构化数据模型。序列化大字块。如果有很多子类型并且必须经常的增加新的属性支持,则可以使用一个BLOB列来存储xml或者json格式的子类型的特殊属性。这种方式很容易扩展。但是无法获取某个指定的属性查询,也无法对其中的属性进行聚合排序查询。
5.如果你接收已经使用EAV设计的表,那么从数据库查询出来的数据需要写另外的应用代码来遍历结果数据进行处理。
为元数据使用元数据。
第七章:多态关联
目标:引用多张父表 一个给定的评论只能外键关联一个bug表或者一个特性表。SQL不支持按行连接不同的表。foreigh key(issue_id) references bugs(issue_id) or freatureRequests(issue_id)
反模式:使用双用途外键。
1.定义多态关联。使用另外一个列issue_tyep取值为bugs或者featureRequests。但是这样的话就不能定义外键了。
2.使用多态关联进行查询。select * from comments as c left outer join bugs as b on(b.issue_id=c.issue_id and c.issue_type='bugs') left outer join featurerequests as f on(f.issue_id=c.issue_id and c.issue_type='featurerequests')
解决方案:让关系变得简单
1.反向引用。多态关联是多个反向关联。
2.创建交叉表 分别为bugs和featureRequests表再创建一张表,里面有这个表的id和对应父表的id保存两个表的关系。
3.创建公用的超级表。超级表只保存一个issue_id,其他bugs,featureRequests,comments表共同引用这个表的外键约束。
在每个表与表的关系中,都有一个引用表和一个被引用表。
发表评论
-
mysql的复制设置详解
2013-06-18 09:44 1137原文链接:http://www.javaarch.ne ... -
MySQL Events详解
2013-06-06 12:28 769原文链接:http://www.javaarch.net/ ... -
分布式唯一主键生成策略的一种开销比较小的方法
2013-06-05 09:26 1302原文链接:http://www.javaarch.net/ ... -
Oracle删除重复记录的几种方式
2013-06-05 09:26 706原文链接:http://www.javaarch.net/ ... -
Oracle 11G 虚拟列 Virtual Column介绍
2013-06-04 09:31 1242原文链接:http://www.javaarch.net/ ... -
Oracle Skip Locked
2013-06-04 09:30 856原文链接:http://www.javaarch.net/ ... -
各个数据库获取随机列的语法
2013-06-04 09:30 674原文链接:http://www.javaarch.net/ ... -
如何重置mysql的密码
2013-06-04 09:30 731原文链接:http://www.javaarch.net/ ... -
使用Mysqldump 备份数据库
2013-06-04 09:29 735原文地址:http://www.javaarch.net/ ... -
MySQL 全文搜索支持
2013-06-03 00:06 642原文地址:http://www.javaarch.net/ ... -
怎么重置mysql的自增列
2013-06-03 00:06 728原文链接:http://www.javaarch.net/ ... -
使用ssd硬盘加速 mysql index查询
2013-05-30 18:28 1514使用ssd硬盘加速 mysql index查询 更 ... -
mysql修改表默认字符集可能带来的隐患
2013-05-29 13:28 1116原文链接:http://www.javaarch.net/j ... -
Mysql 5.5分区特性增强深度解析
2013-05-22 13:49 1478原文链接:http://www.javaarc ... -
mysql常用监控脚本命令列表
2013-04-07 09:15 1300#/bin/sh #检测mysql server是否 ... -
hsqldb源码分析系列6之事务处理
2013-01-20 15:20 1706在session的 public Result ... -
hsqldb源码分析系列5 查询引擎之查询操作
2013-01-18 17:27 2310执行过程先分析select语句的解析过程: ... -
hsqldb源码分析系列4 查询引擎之查询操作
2013-01-18 00:27 1017查询过程前面解析类似insert,最终调用是在 ... -
hsqldb源码分析系列3 执行引擎分析 插入过程分析
2013-01-17 21:43 1388我们看看insert语句的执行过程, 如 ... -
hsqldb源码分析系列2 解析器分析
2013-01-17 17:22 1122在server类的handleC ...
相关推荐
【作品名称】:基于servlet+jsp+mysql实现的影视管理系统【课程设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于servlet+jsp+mysql实现的影视管理系统【课程设计】 基于servlet+jsp+mysql实现的影视管理系统【课程设计】 Java Web课程设计,基于servlet+jsp+ajax+mysql做的影视管理系统 运行环境: Tomcat 9.0 JDK 1.8 MySQL 8.0 后台管理账号密码均为:root,项目依赖:lib 目录 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
kernel-5.15-ky10-x86.tar.gz
【作品名称】:基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:本设计中的波形发生器系统要求基于51单片机,因此选用以AT89C51单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个波形发生器的硬件系统。使用C 语言对单片机编程可产生相应的正弦波,方波,三角波,锯齿波梯形波波形信号。在程序运行时,当接收到按键信息后,需要输出某种波形时,调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出即可得到要求的波形。 当需要改变频率时只需要改变单片机的波形发生程序中的递增或者递减变量即可。 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
基于java的法律咨询系统设计与实现.docx
适用于元营销 API 的 Python SDK适用于 Python 的 Facebook Business SDK 介绍Facebook Business SDK是一站式服务,可帮助我们的合作伙伴更好地服务于他们的业务。合作伙伴正在使用多个 Facebook API 来满足其客户的需求。采用所有这些 API 并在各个平台上保持最新状态可能非常耗时,而且最终会造成高昂的成本。为此,Facebook 开发了 Business SDK,将其许多 API 捆绑到一个 SDK 中,以简化实施和维护。Business SDK 是 Marketing API SDK 的升级版,其中包括 Marketing API 以及来自不同平台(如 Pages、Business Manager、Instagram 等)的许多 Facebook API。快速入门商业SDK入门指南Python 目前是我们第三方开发人员最常用的语言。是一个 Python 包,它提供了您的 Python 应用程序与Business SDK 内的 Facebook APIfacebook_business之间的
数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 公交车调度的运作数学模型 共12页.pdf
smart-http 是一款可编程的 Http 应用微内核,方便用户根据自身需求进行 Server 或 Client 的应用开发。支持GET、POST的 HTTP 请求。提供了 URL 路由组件,可以快速搭建一套静态服务器。支持部分 RFC2612 规范,后续会逐渐完善。支持 Https 协议,由 smart-socket 为其赋能。具备文件上传的能力。支持 websocket、Cookie支持 Server、Client 开发
新闻资讯系统 微信小程序+SpringBoot毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1oiBpYcEBp
高校师生工作室-JAVA-基于微信小程序的高校师生工作室管理系统的设计与实现
基于java的常见小儿疾病中医护理系统设计与实现.docx
本教程播放列表涵盖了 Python 中的数据结构和算法。每个教程都有数据结构或算法背后的理论、BIG O 复杂性分析和可供练习的练习。使用 Python 的数据结构和算法本教程涵盖了 Python 中的数据结构和算法。每个教程都包含数据结构或算法背后的理论、BIG O 复杂度分析以及可供练习的练习。要观看视频,您可以访问播放列表https://www.youtube.com/playlist?list=PLeo1K3hjS3uu_n_a__MI_KktGTLYopZ12订阅 codebasics youtube 频道https://www.youtube.com/c/codebasics
数学建模学习资料 蒙特卡罗方法课件教程 第2章.随机数 共29页.pptx
python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。 python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业)python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大
中小学知识产权教育试点学校申报表.doc
基于django的音乐推荐系统.zip
在建工程涉及专项行动情况检查表.docx
本项目是一个基于Python技术的学生管理系统,采用Django框架进行开发,旨在为计算机相关专业的学生提供一个实践性强、功能全面的管理系统,以帮助他们完成毕业设计或进行项目实战练习。 系统实现了对学生信息、课程信息、成绩、考勤等多方面的管理功能。学生信息管理包括学生基本信息的增删改查;课程信息管理允许管理员设置课程信息,包括课程名称、授课老师、学分等;成绩管理功能使学生和教师能够录入、查看和修改成绩;考勤管理则方便教师记录学生的出勤情况。 该项目采用B/S架构,前端使用HTML、CSS、JavaScript等技术,后端使用Python语言和Django框架,数据库采用MySQL。Django框架提供了强大的后台管理功能,使得系统管理更加便捷。 通过开发这个项目,学生不仅能提升自己的编程能力,还能学习到如何构建一个实际应用的系统,对于即将步入职场的学生来说,具有很高的实用价值。
适用于 Python 的 Splunk 软件开发工具包参考文档适用于 Python 的 Splunk Enterprise 软件开发工具包版本 2.1.0适用于 Python 的 Splunk Enterprise 软件开发套件 (SDK) 包含库代码,旨在使开发人员能够使用 Splunk 平台构建应用程序。Splunk 平台是一个搜索引擎和分析环境,它使用分布式 map-reduce 架构来有效地索引、搜索和处理大型时变数据集。Splunk 平台深受系统管理员的欢迎,用于聚合和监控 IT 机器数据、安全性、合规性以及各种其他场景,这些场景都需要有效地从大量时间序列数据中索引、搜索、分析和生成实时通知。Splunk 开发者平台使开发人员能够利用 Splunk 平台所使用的相同技术来构建令人兴奋的新应用程序。开始使用 Python 版 Splunk SDK开始使用 Python 版 Splunk Enterprise SDKSplunk Enterprise SDK for Python 包含库代码,其示例位于splunk-app-examples存储库
分布式事务练习
家庭财务管理系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS