怎么将数据库中存的树转化为树形列表

怎么将数据库中存的树转化为树形列表,第1张

树状结构的数据保存在数据库中的常用方法有一下两种:

1、邻接表(adjacency list model)

2、预排序遍历树算法(modified preorder tree traversal algorithm)

用一下的例子讨论这两种方法的差异:

现有一棵树如下:

邻接表模式:

这种模式我们经常用到,很多的教程和书中也介绍过。我们通过给每个节点增加一个属性 parent 来表示这个节点的父节点从而将整个树状结构通过平面的表描述出来。根据这个原则,例子中的数据可以转化成如下的表:

我们看到 Pear 是Green的一个子节点,Green是Fruit的一个子节点。而根节点'Food'没有父节点。 为了简单地描述这个问题, 这个例子中只用了name来表示一个记录。 在实际的数据库中,你需要用数字的id来标示每个节点,数据库的表结构大概应该像这样:id, parent_id, name, description。

以下是代码:

<php

// $parent is the parent of the children we want to see

// $level is increased when we go deeper into the tree,

// used to display a nice indented tree

function display_children($parent, $level)

{

// 获得一个 父节点 $parent 的所有子节点

$result = mysql_query('SELECT name FROM tree '

'WHERE parent="'$parent'";');

// 显示每个子节点

while ($row = mysql_fetch_array($result))

{

// 缩进显示节点名称

echo str_repeat(' ',$level)$row['name']"n";

//再次调用这个函数显示子节点的子节点

display_children($row['name'], $level+1);

}

}

>

对整个结构的根节点(Food)使用这个函数就可以打印出整个多级树结构,由于Food是根节点它的父节点是空的,所以这样调用: display_children('',0)。将显示整个树的内容:

Food

Fruit

Red

Cherry

Yellow

Banana

Meat

Beef

呵呵,连接,第一要看你本地网络,第二要看主机商对你数据库并发量的限制了啦!你还可以使用比如Navicat

for

MySQL或者SQLyogEnt来试试,我现在使用的还不错!呵呵!

基本知识

Oracle 的  SQL LOADER  可以将外部格式化的文本数据加载到数据库表中 通常 与 SPOOL导出文本数据方法配合使用

命令格式

SQLLDR keyword=value [ keyword=value ……]

例 $ sqlldr user/pwd control=emp ctl data=emp dat bad=emp bad log=emp log

控制文件

SQLLOADER  根据控制文件可以找到需要加载的数据 并且分析和解释这些数据

控制文件由三个部分组成 具体参数参考帮助文档   全局选件 行 跳过的记录数等 INFILE 子句指定的输入数据   数据特性说明

ment ——注释

load data infile

append    ——除了 append外 还有 insert replace truncate等方式

into table emp fields terminated b y |

no             float external name char( )

age           integer external

duty         char( ) salary      float external

upd_ts     date( ) YYYYMMDDHH MISS )

begindata

|Mulder| | | |

|Scully| | | |

控制文件中infile选项跟sqlldr 命令行中data 选项含义相同 如使用infile 则表明数据在本控制文件以 begin data 开头的区域内 一些选项 FIELDS TERMINATED BY WHITESPACE FIELDS TERMINATED BY x FILLER_ FILLER //  指定某一列将不会被装载

DEPTNO position( ) DNAME position( ) //  指定列的位置SEQNO RECNUM //载入每行的行号

SKIP n          //  指定导入时可以跳过多少行数据

数据文件

按控制文件数据格式定义的数据行集

|Tom| | | |

|Jerry| | | |

固定格式 可变格式 流记录格式

固定格式

当数据固定的格式(长度一样)时且是在文件中得到时 要用 INFILE fix n

load data

infile example dat fix

into table example

fields terminated b y optionally enclosed by

(col char( ) col char( )) example dat

cd fghi

lmn

pqrs

uvwx

可变格式

当数据是可变格式(长度不一样)时且是在文件中得到时 要用 INFILE var n 如

load data

infile example dat var

into table example

fields terminated b y optionally enclosed by

(col char( ) col char( )) example dat

hello cd world im

my name is

流记录格式 // Stream recored format load data infile xx dat str |\n

into table xx field terminated b y optionally enclosed by

(col char( ) col char( ))

example dat

hello ccd |

world bb |

  坏文件

bad=emp bad坏文件包含那些被 SQLLoader拒绝的记录 被拒绝的记录可能是不符合要求的记录

  日志文件及日志信息

log=emp log当 SQLLoader  开始执行后 它就自动建立  日志文件 日志文件包含有加载的总 结 加载中的错误信息等

  高级选项

Conventional Path Load与Direct Path Load

Conventional path Load 通过常规通道方式上载

特点 mit always  gen redo logs   enforce all constraints fire insert triggers can load into cluster other user can make change

rows 每次提交的记录数

bindsize 每次提交记录的缓冲区

readsize 与 bindsize 成对使用 其中较小者会自动调整到较大者

sqlldr 先计算单条记录长度 乘以 rows 如小于 bindsize 不会试图扩张 rows以填充 bindsize 如超出 则以 bindsize 为准 命令为

$ sqlldr dbuser/oracle control=emp ctl log=emp log rows= bindsize=

Direct Path Load

通过直通方式上载 可以跳过数据库的相关逻辑 不进行  SQL解析 而直接将数 据导入到数据文件中

特点 save conditionly gen redo logs enforce PK UK NN not fire triggers can not load into cluster other user can not make change命令为

$ sqlldr dbuser/oracle control=emp ctl log=emp log direct=true

SPOOL导出文本数据方法

导入的数据文件可以用 SPOOL导出文本数据方法生成

SQLPLUS环境设置

SET NEWPAGE NONE HEADING OFF SPACE

PAGESIZE SET TRIMOUT ON TRIMSPOOL ON LINESIZE

注 LINESIZE 要稍微设置大些 免得数据被截断 它应和相应的 TRIMSPOOL结合使用防止导出的文本有太多的尾部空格

但是如果 LINESIZE 设置太大 会大大降低导出的速度 另外在 WINDOWS下导 出最好不要用 PLSQL导出 速度比较慢 直接用  MEND 下的 SQLPLUS命令最 小化窗口执行 对于字段内包含很多回车换行符的应该给与过滤 形成比较规矩的文本 文件

通常情况下 我们使用 SPOOL方法 将数据库中的表导出为文本文件 如下述

set trimspool on

set linesize pagesize newpage heading off    term off spool  路径+文件名

select col || ||col || ||col || ||col || …… from tablename

spool off

脚本

  将表中数据记录导出为字段值用分隔符 | 分开的 dat文件

#!/bin/ksh

##################################################################

##    名称 unloadtable

##    功能   本 shell 用于将表中数据记录导出

##                 导出为字段值用分隔符 | 分开的 dat文件

##    编者

##    日期

##################################################################

if [ $# ne ]

then echo usage unloadtable tablename username password

exit

fi

##准备工作

echo set heading off     >/tmp/$l

echo set pagesize >>/tmp/$l

echo set linesize     >>/tmp/$l

echo set feedback off    >>/tmp/$l

echo set tab off              >>/tmp/$l

echo  select  column_name||   from  user_tab_columns  where  lower(table_name)= $   order  by

column_id >> /tmp/$l

##产生 select 语句

echo set heading off     >/tmp/$ sel

echo set pagesize >>/tmp/$ sel

echo set linesize     >>/tmp/$ sel

echo set feedback off    >>/tmp/$ sel

echo set tab off              >>/tmp/$ sel

echo select >>/tmp/$ sel

echo  `sqlplus  s  $ /$   <  /tmp/$l`  |sed  s/ /|| | ||/g   |sed  s/||$//g |sed  s/date/\ date\ /g

>>/tmp/$ sel

##生成 dat文件

#echo from $ \n/ >>/tmp/$ sel    由于  /  导致多执行一次 select

echo from $ \n >>/tmp/$ sel

sqlplus s $ /$ < /tmp/$ sel >$ _tmp dat

#awk {if(FNR!= ) print $ } $ _tmp dat >$ dat       FNR 选项使得第一条记录选不出

awk {print $ } $ _tmp dat >$ dat

rm f $ _tmp dat

  将数据导入到相应表中

#!/bin/ksh

##################################################################

##    名称 loadtable

##    功能 本 shell 用于将已经准备好的 dat数据文件导入相应的表中

##               dat 文件各个字段值用分隔符 | 分开

##    编者

##    日期

##################################################################

if [ $# ne ]

then

echo usage loadtable tablename username    password exit fi

##准备工作

echo set heading off     >/tmp/$lsql

echo set pagesize >>/tmp/$lsql

echo set linesize     >>/tmp/$lsql

echo set feedback off    >>/tmp/$lsql

echo set tab off              >>/tmp/$lsql

echo  select  column_name||   from  user_tab_columns  where  lower(table_name)= $   order  by

column_id >> /tmp/$lsql

##产生 ctl文件

echo load data >/tmp/$ ctl

echo infile >>/tmp/$ ctl

echo into table $ >>/tmp/$ ctl

echo fields terminated by | >>/tmp/$ ctl

echo `sqlplus s $ /$ < /tmp/$lsql` |sed s/ $/)/g |sed s/^/(/g >>/tmp/$ ctl

##开始导入数据

echo truncate table $ >/tmp/$ sql

sqlplus $ /$ < /tmp/$ sql

lishixinzhi/Article/program/Oracle/201311/17312

1直接方法,将需要的查询的数据赋值到excel中。相应调整,然后再赋值到目标表中(对于数据量不大的情况下较快)

2最好两数据库拥有相同的登录名和密码不然比较麻烦

insertinto目标数据库dbo目标表名(字段1字段n)

select段1字段nfrom源数据库dbo源表名

或select段1字段ninto目标数据库dbo目标表名from源数据库dbo源表名

3这样的插入注意表字段的长度和约束条件,若原表中字段长,就得将目标表中的字段相应加长

我们都知道,服务器数据库的开发一般都是通过java或者是PHP语言来编程实现的,而为了提高我们数据库的运行速度和效率,数据库优化也成为了我们每日的工作重点,今天,北京IT培训就一起来了解一下mysql服务器数据库的优化方法。

为什么要了解索引

真实案例

案例一:大学有段时间学习爬虫,爬取了知乎300w用户答题数据,存储到mysql数据中。那时不了解索引,一条简单的“根据用户名搜索全部回答的sql“需要执行半分钟左右,完全满足不了正常的使用。

案例二:近线上应用的数据库频频出现多条慢sql风险提示,而工作以来,对数据库优化方面所知甚少。例如一个用户数据页面需要执行很多次数据库查询,性能很慢,通过增加超时时间勉强可以访问,但是性能上需要优化。

索引的优点

合适的索引,可以大大减小mysql服务器扫描的数据量,避免内存排序和临时表,提高应用程序的查询性能。

索引的类型

mysql数据中有多种索引类型,primarykey,unique,normal,但底层存储的数据结构都是BTREE;有些存储引擎还提供hash索引,全文索引。

BTREE是常见的优化要面对的索引结构,都是基于BTREE的讨论。

B-TREE

查询数据简单暴力的方式是遍历所有记录;如果数据不重复,就可以通过组织成一颗排序二叉树,通过二分查找算法来查询,大大提高查询性能。而BTREE是一种更强大的排序树,支持多个分支,高度更低,数据的插入、删除、更新更快。

现代数据库的索引文件和文件系统的文件块都被组织成BTREE。

btree的每个节点都包含有key,data和只想子节点指针。

btree有度的概念d>=1。假设btree的度为d,则每个内部节点可以有n=[d+1,2d+1)个key,n+1个子节点指针。树的大高度为h=Logb[(N+1)/2]。

索引和文件系统中,B-TREE的节点常设计成接近一个内存页大小(也是磁盘扇区大小),且树的度非常大。这样磁盘I/O的次数,就等于树的高度h。假设b=100,一百万个节点的树,h将只有3层。即,只有3次磁盘I/O就可以查找完毕,性能非常高。

索引查询

建立索引后,合适的查询语句才能大发挥索引的优势。

另外,由于查询优化器可以解析客户端的sql语句,会调整sql的查询语句的条件顺序去匹配合适的索引。

char:固定长度,例如:char(6),你输入的字符小于6时,它会在后面补空值。当你输入的字符大于指定的数时,它会截取超出的字符。

存储字符:ANSI

数字英文存储:最多能存储8000个。

汉字存储:4000个汉字

-----------------------------分割---------------------------

varchar(n):可变长度,(n为某一整数,不同数据库,最大长度n不同)

存储字符:ANSI

n必须是一个介于1和8,000之间的数值。存储大小为输入数据的字节的实际长度,而不是n个字节。所输入的数据字符长度可以为零。

数字英文存储:最多能存储8000个。

汉字存储:4000个汉字

-----------------------------分割-----------------------------

nvarchar:可变长度,

存储字符:Unicode

Unicode所有的字符(汉字和英文)都用两个字节表示。

数字英文存储:最多能存储4000个。

汉字存储:4000个汉字

一般来说如果含有中文字符,用nvarchar,如果纯英文和数字,用char/varchar。

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。

在信息化社会,充分有效地管理和利用各类信息资源,是进行科学研究和决策管理的前提条件。数据库技术是管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。

以上就是关于怎么将数据库中存的树转化为树形列表全部的内容,包括:怎么将数据库中存的树转化为树形列表、Nhibernate访问Mysql数据库,为什么速度如此的慢、Oracle数据库备份与恢复之二:SQL*Loader等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9509211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存