数据库分层数据现实方法
分层数据
- 分层数据的每项(除根项)只有一个父项和零个或多个子项的数据集合。
- 分层数据存在于许多基于数据库的应用程序中,包括论文和邮件列表中的分类、组织层级关系、内容管理系统的分类、产品分类。
邻接表模型
数据库中结构:
+--------+----------------------+--------------+
| id | name | parent_id |
+-------------+-----------------+--------------+
| 1 | 智慧学校 | NULL |
| 2 | 广东省教育厅 | 1 |
| 3 | 广州市教育厅 | 2 |
| 4 | 东莞市教育厅 | 2 |
| 5 | 佛山市教育厅 | 2 |
| 6 | 荔湾区华侨小学 | 3 |
| 7 | 湖南省教育厅 | 1 |
| 8 | 长沙市教育厅 | 7 |
| 9 | 湘潭市教育厅 | 7 |
| 10 | 张家界市教育厅 | 7 |
+-------------+----------------------+--------+
优点:
实现简单,能直观看到直接父子关系。
缺点:
当要检索某节点下所有子孙节点时,只能一层一层递归查询。
orcal中实现子孙节点查找:
SELECT * FROM unit t CONNECT BY prior t.parent_id=t.id start with t.parent_id = 1
mysql使用函数实现(使用函数形式):
CREATE FUNCTION getChildLst(id INT)RETURNS varchar(1000) CHARSET utf8
BEGIN DECLARE sTemp VARCHAR(1000); DECLARE sTempChd VARCHAR(1000); SET sTemp = '$'; SET sTempChd =cast(rootId as CHAR); WHILE sTempChd is not null DO SET sTemp = concat(sTemp,',',sTempChd); SELECT group_concat(id) INTO sTempChd FROM emp where FIND_IN_SET(parentId,sTempChd)>0; END WHILE; RETURN substr(sTemp,3); END
看上面的语句是全表扫描,没有走索引。一些数据量比较大的表,查询就很慢。
前缀编码模型
数据库结构
+-------------+-----------------+--------+
| id | name | code |
+--------+----------------------+--------+
| 1 | Seewo智慧学校 | 001 |
| 2 | 广东省教育厅 | 001001 |
| 3 | 广州市教育厅 | 001001001 |
| 4 | 东莞市教育厅 | 001001002 |
| 5 | 佛山市教育厅 | 001001003 |
| 6 | 荔湾区华侨小学 | 001001001001 |
| 7 | 湖南省教育厅 | 001002 |
| 8 | 长沙市教育厅 | 001002001 |
| 9 | 湘潭市教育厅 | 001002002 |
| 10 | 张家界市教育厅 | 001002003 |
+-------------+----------------------+--------+
节点编码:为当前记录行的编码(内部编码),它的所有直接下级记录行的编码都是以它为依据进行扩展。
优点:
使用like语句即可查出其所有子孙节点的记录集。
缺点:
固定长度编码限制了子节点的个数,层级不明显,查询直系亲属节点麻烦。
每层的节点个数受编码长度限制
改进的前缀编码模型
数据库结构
+--------+------------------+----------------+--------------+--------------+
| id | name | parent_id | code | childMaxNum |
+--------+------------------+----------------+--------------+--------------+
| 1 | Seewo智慧学校 | NULL | 1. | 2 |
| 2 | 广东省教育厅 | 1 | 1.1. | 3 |
| 3 | 广州市教育厅 | 2 | 1.1.1. | 1 |
| 4 | 东莞市教育厅 | 2 | 1.1.2. | 0 |
| 5 | 佛山市教育厅 | 2 | 1.1.3. | 0 |
| 6 | 荔湾区华侨小学 | 3 | 1.1.1.1. | 0 |
| 7 | 湖南省教育厅 | 1 | 1.2. | 3 |
| 8 | 长沙市教育厅 | 7 | 1.2.1. | 0 |
| 9 | 湘潭市教育厅 | 7 | 1.2.2. | 0 |
| 10 | 张家界市教育厅 | 7 | 1.2.3. | 0 |
+--------+-------------------+---------------+--------------+--------------+
改进的前缀编码模型中添加了直系父节点id的parent_id,和当前子节点分配最大数childMaxNum(记录了当前已分配的数字),前缀编码code使用特殊符号区分节点的层次。
查找子孙节点sql:
select * from unit where code like ‘1.1.%’
嵌套集合模型
模型图:
使用左值和右值来表现嵌套集合模型中数据的分层特性。
优点:
所有子孙节点的左右值都在父节点的左右值范围内,能快速查找出一棵子树,且能快速判断是否含有子节点。
缺点:
1、当增加删除一个节点时,需要更新其他节点的左右值。
2、层级不明显。
二叉树模型
把这种层级结构变换为二叉树模型,变换规则,某节点A的左边第一个子节点B作为A左子节点,B右边第一个兄弟节点C作为B的右子节点,如果C右边还有兄弟节点D,则把D作为C的右子节点,如此类推。最后变换为下图:
每个节点的编码以一维数组存放二叉树的方式进行编码
+-------------+-----------------+----------+
| id | name | location |
+--------+----------------------+----------+
| 1 | Seewo智慧学校 | 1 |
| 2 | 广东省教育厅 | 2 |
| 3 | 广州市教育厅 | 4 |
| 4 | 东莞市教育厅 | 9 |
| 5 | 佛山市教育厅 | 19 |
| 6 | 荔湾区华侨小学 | 8 |
| 7 | 湖南省教育厅 | 5 |
| 8 | 长沙市教育厅 | 10 |
| 9 | 湘潭市教育厅 | 21 |
| 10 | 张家界市教育厅 | 43 |
+-------------+-----------------+---------+
MongoDB实现
使用非关系型数据库优点可以快速的查找
{ id:"1", name:"Seewo智慧学校", ancestors:[], parent:null }
{ id:"2", name:"广东省教育厅", ancestors:["1"], parent:"1" }
{ id:"3", name:"广州市教育厅 ", ancestors:["1","2"], parent:"2" }
{ id:"4", name:"东莞市教育厅", ancestors:["1","2"], parent:"2" }
{ id:"5", name:"佛山市教育厅", ancestors:["1","2"], parent:"2" }
{ id:"6", name:"荔湾区华侨小学", ancestors:["1","2","3"], parent:"3" }
{ id:"7", name:"湖南省教育厅", ancestors:["1"], parent:"1" }
{ id:"8", name:"长沙市教育厅", ancestors:["1","8"], parent:"7" }
{ id:"9", name:"湘潭市教育厅", ancestors:["1","8"], parent:"7" }
{ id:"10", name:"张家界市教育厅", ancestors:["1","8"], parent:"7" }
查找id=1的所有子孙节点:find({ancestors:”1”})
数据库分层数据现实方法相关推荐
- oracle怎么将一列挪到另一列,详细讲解Oracle数据库的数据迁移方法
<详细讲解Oracle数据库的数据迁移方法>由会员分享,可在线阅读,更多相关<详细讲解Oracle数据库的数据迁移方法(4页珍藏版)>请在人人文库网上搜索. 1.详细讲解 Or ...
- Oracle数据库迁移测试数据,Oracle数据库的数据迁移方法
Oracle数据库的数据迁移方法 发表于:2008-04-14来源:作者:点击数: 随着数据库管理系统和操作系统平台的更新换代的速度的加快,数据库管理员经常需要在两个不同的数据库之间或在两种不同的系统 ...
- mysql 刷新二进制日志_使用binlog日志恢复MySQL数据库删除数据的方法
binlog日志简介: binlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间. b ...
- VC中连接mdb数据库及其数据读取方法
最近在做一个兼职,涉及到利用vc连接mdb数据库的问题. 先介绍一下第一种方法: _ConnectionPtr m_pConnection; CoInitialize(NULL); //对连接进行初始 ...
- oledb vc访问mdb数据库_VC中连接mdb数据库及其数据读取方法
最近在做一个兼职,涉及到利用vc连接mdb数据库的问题. 先介绍一下第一种方法: _ConnectionPtr m_pConnection; CoInitialize(NULL); //对连接进行初始 ...
- PHP和MySQL处理树状、分级、无限分类、分层数据的方法
文章标题中的多个词语表达的其实是一个意思,就是递归分类数据,分级数据非常类似数据结构中的树状结构,即每个节点有自己的孩子节点,孩子结点本身也是父亲节点.这是一个递归.分层形式.可以称之为树形层级数据. ...
- php和mysql处理树状_分级_无限分类_分层数据的方法_PHP和MySQL处理树状、分级、无限分类、分层数据的方法...
文章标题中的多个词语表达的其实是一个意思,就是递归分类数据,分级数据非常类似数据结构中的树状结构,即每个节点有自己的孩子节点,孩子结点本身也是父亲节点.这是一个递归.分层形式.可以称之为树形层级数据. ...
- SQL Server数据库六种数据移动方法
1. 通过工具DTS的设计器进行导入或导出DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不多,如果只是进行SQL Server数据库中部分表的移动,用这种方法最好,当然, ...
- ORACLE使用copy方式存储迁移,详细讲解Oracle数据库的数据迁移方法
添加所需的表空间和用户到目标数据库中:安装所需的SQL*Net2或者Net8软件,并配置用于连接数据库的别名. 在DOS命令提示符下设置oracle_sid=Oracle7_sid. 以Interna ...
最新文章
- java tostring方法_Java程序员小伙启动项目报错,原来是使用了lombok
- mac 下安装jenkins
- 给你这张图,你能搜索到来历吗
- 使用Swift触摸任意位置以关闭iOS键盘
- 计算机图形学(四)—— 实验四:种子填充算法
- vmware 12 可用 序列号
- Android 常用颜色值及半透明效果配置
- Kinect外包团队(长年承接微软Kinect体感项目外包,有大型Kinect案例)
- 赏析角度有哪些_诗词赏析-怎样赏析诗词的技巧-诗句赏析的角度有哪些
- php eval 引号,PHP手册-eval()(可以将单引号中的变量解析)
- python合并word_用Python实现Word多文档合并
- R Failed to install 'unknown package' from GitHub: schannel: failed to receive handshake, SSL/TLS
- 互联网上的单点登录研究
- 编程学习文档 参考资料和文档
- 智能热流体仿真软件AICFD 2023R1新版本功能介绍
- 网络安全课程笔记(二)
- 经常性收入、MRR、ARR 的定义和计算方法
- 【原】简单的鼠标切换左右键(java版)
- python 依赖管理 pipenv
- 代理和穿透还能这么玩?