数据库表设计,没有最好只有最适合(下)


三、闭包表

闭包表是解决分级存储的一个简单而优雅的解决方案,它记录了树中所有节点间的关系,而不仅仅只有那些直接的父子节点。

在设计评论系统时,我们额外创建了一个叫 tree_paths 表,它包含两列,每一列都指向 comments 中的外键。

我们不再使用comments 表存储树的结构,而是将树中任何具有(祖先 一 后代)关系的节点对都存储在treepaths 表里,即使这两个节点之间不是直接的父子关系ÿ存储容量单位1b存储器可分为哪三类;同时,我们还增加一行指向节点自己。通过treepaths 表来获取祖先和后代比使用嵌套集更加的直接。例如要获取评论#4的后代,只需要在 treepaths 表中搜索祖先是评论 #4的行就行了。同样获取后代也是如此。

要插入一个新存储容量的叶子节点,比如程序员工资一般多少钱一个月评论#6的一个子节点,应首先插入一条自己到自己的关系,然后搜索 t存储reepaths 表中后代是评论#6 的节点,增程序员工资一般多少加该节点和新插入节点的“祖先一后代”关系(新节点ID 应该为8):

INSERT INTO treepaths(ancestor,descendant)
SELECT t.ancestor,8
FROM treepaths AS t
WHERE t.descendant = 6
UNION ALL
SELECT 8,8;

要删除一个叶子节点,比如评论#7, 应删除所有treepaths 表中后代为评论 #7 的行:

DELETE FROM treepaths
WHERE descendant = 7;

要删除一颗完整的子树,比如评论#4 和它所有的后代,可删除所有在 treepaths 表中后代为 #4的行,以及那些以评论#4后代为后代的行。

闭包表孙侨潞的设计比嵌套集更加的直接,两者都能快捷地查询给定节点的祖先和后代,但是闭包表能更加简单地维护分层信息。这两个设计都比使用邻接表或者路径枚举更方便地查询给定节点的直接后代和祖先。

然而你可以优化闭包表来使它更方便地查程序员客栈询直接父亲节点或者子节点:在 treep舍曲林aths 表中添加一个 path_length 字段。一个节点的自我引用的path_length 为0,到它直接子节点的path_l数据系统ength 为1,再下一数据原理及应用层为2,以此类推。这样查询起来数据查询语句就方便多了。

总结:你该使用哪种设计ÿ数据库1f;

每种设计都各有优劣,如何选择设计ÿ孙侨潞0c;依赖于应用程序的哪种操作是你最需要性能上的优化。

数据库表设计,没有最好只有最适合(下)层级数据设计比较

1、程序员工资一般多少钱一个月邻接表是最方便的设计,并且很多程序员都了解它

2、如果你使用的数据库支持程序员工资一般多少钱一个月WITH 或者 CONNECT BY PRIOR 的递归查询&#存储容量单位xff0c;那能使得存储诸天邻接表的查询更高效

3、枚举路径能够很直观地展示出祖先到存储处理国家秘密的计算机信息后代之间的路径,但同时由于它不能确保引用完整性,使得这个设计非常脆弱。程序员需要什么学历枚举路径也使得数据的存储变得比较冗余。

4、嵌套集是一个聪明的解决方案,但可能过于聪明,它不能确保引用完整性。最好在一个查询性能要求很高申请了营业执照可以不经营吗而对其他要求程序员工资一般多少一般的场合来使用它。

5、闭包程序员那么可爱电视剧免费观看表是最通用的设计,并且以上的方数据库是什么案也只有它能允许一个节点数据库技术属于多棵树。它要求一数据库原理及应用张额外的表来存储关系,使用空间换时间的方案减少操作过程中由冗余的计算所造成的消耗。

这几数据库管理系统种设计方案只是我们日常设计中的一部分,开发中肯定会遇到更多的选择方案。选择程序员需要什么学历哪一种方案,是需要切合实际,根据自己项目的需求,结合方案的优劣存储处理国家秘密的计算机信息,选择最适合的一种。

我遇到数据库系统一些开发人员存储器,为了敷衍了事,在设计数据库表时,只考虑能否完成眼数据库下的任务,不太注重以后拓展的问题&盛气凌人的意思#xff0c;不考虑数据库系统概论第五版课后答案查询起来是否神祇领主时代耗性能。可能前期数据量不多的时候,看不出什么影响,但数据量稍微多一点的话,就已经显而易见了(例如:可以使用外联接查询的,偏数据库技术偏要使用子查询)。

我觉得设计数据库是程序员那么可爱电视剧免费观看一个很有存储器中存取速度最快的是趣且充满挑战的工作,它有时存储能体现你的视野有多宽广,有时它能让数据库系统概论第五版课后答案你睡不着觉,总之痛并快乐着。