文档库 最新最全的文档下载
当前位置:文档库 › [TREE]采用左右值编码来存储无限分级树形结构的数据库表设计

[TREE]采用左右值编码来存储无限分级树形结构的数据库表设计

[TREE]采用左右值编码来存储无限分级树形结构的数据库表设计
[TREE]采用左右值编码来存储无限分级树形结构的数据库表设计

采用左右值编码来存储无限分级树形结构的数据库表设计

之前我介绍过一种按位数编码保存树形结构数据的表设计方法,详情见:浅谈数据库设计技巧(上)

该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由于层信息位数的限制,限制了每层能所允许的最大子节点数量及最大层数。同时,在添加新节点的时候必须先计算新节点的位置是否超过最大限制。

上面的设计方案必须预先设定类别树的最大层数以及最大子节点数,不是无限分级,在某些场合并不能采用,那么还有更完美的解决方案吗?通过google的搜索,我又探索到一种全新的无递归查询,无限分级的编码方案——左右值。原文的程序代码是用php写的,但是通过仔细阅读其数据库表设计说明及相关的sql语句,我彻底弄懂了这种巧妙的设计思路,并在这种设计中新增了删除节点,同层平移的需求(原文只提供了列表及插入子节点的sql语句)。

下面我力图用比较简短的文字,少量图表,及相关核心sql语句来描述这种设计方案:

首先,我们弄一棵树作为例子:

商品

|---食品

| |---肉类

| | |--猪肉

| |---蔬菜类

| |--白菜

|---电器

|--电视机

|--电冰箱

select count(*) from tree where lft <= 2 and rgt >= 11

为了方便列表,我们可以为tree表建立一个视图,添加一个层数列,该类别的层数可以写一个自定义函数来计算。该函数如下:

CREATE FUNCTION dbo.CountLayer

(

@type_id int

)

RETURNS int

AS

begin

declare@result int

set@result=0

declare@lft int

declare@rgt int

if exists (select1from tree where type_id=@type_id)

begin

select@lft=lft,@rgt=rgt from tree where type_id=@type_id

select@result=count(*) from tree where lft <=@lft and rgt >=@rgt

end

return@result

end

GO

然后,我们建立如下视图:

CREATE VIEW dbo.TreeView

AS

SELECT type_id, name, lft, rgt, dbo.CountLayer(type_id) AS layer FROM dbo.tree ORDE R BY lft

GO

(

)

AS declare declare if

go

假定我们要在节点“肉类”下添加一个子节点“牛肉”,该树将变成:

1商品18+2

+--------------------------------------------+

2食品11+2 12+2电器17+2

+-----------------+ +-------------------------+

3肉类6+2 7+2蔬菜类10+2 13+2电视机14+2 15+2电冰箱16+2 +-------------+

4猪肉5 6牛肉78+2白菜9+2

看完上图相应节点左右值的变化后,相信大家都知道该如何写相应的sql脚本吧?下面我给出相对完整的插入子节点的存储过程:

CREATE PROCEDURE[dbo].[AddSubNodeByNode]

(

@type_id int,

@name varchar(50)

)

AS

declare@rgt int

if exists (select1from tree where type_id=@type_id)

begin

SET XACT_ABORT ON

BEGIN TRANSACTION

select@rgt=rgt from tree where type_id=@type_id

update tree set rgt=rgt+2where rgt>=@rgt

update tree set lft=lft+2where lft>=@rgt

insert into tree (name,lft,rgt) values (@name,@rgt,@rgt+1)

COMMIT TRANSACTION

SET XACT_ABORT OFF

end

然后,我们删除节点“电视机”,再来看看该树会变成什么情况:

1商品20-2

+-----------------------------------+

2食品13 14电器19-2

+-----------------+

3肉类8 9蔬菜类12 17-2电冰箱18-2

+----------+

4猪肉5 6牛肉7 10白菜11

相应的存储过程如下:

CREATE PROCEDURE[dbo].[DelNode]

@type_id int

AS

declare@lft int

declare@rgt int

if exists (select1from tree where type_id=@type_id)

begin

SET XACT_ABORT ON

BEGIN TRANSACTION

select@lft=lft,@rgt=rgt from tree where type_id=@type_id

delete from tree where lft>=@lft and rgt<=@rgt

update tree set lft=lft-(@rgt-@lft+1) where lft>@lft

update tree set rgt=rgt-(@rgt-@lft+1) where rgt>@rgt

COMMIT TRANSACTION

SET XACT_ABORT OFF

End

注意:因为删除某个节点会同时删除该节点的所有子孙节点,而这些被删除的节点的个数为:(被删节点的右值-被删节点的左值+1)/2,而任何一个节点同时具有唯一的左值和唯一的右值,故删除作废节点后,其他相应节点的左、右值需要调整的幅度应为:减少(被删节点的右值-被删节点的左值+1)。

最后,让我们看看平移节点“电器”,将其和其所有子孙节点移动到节点“食品”之前后,该树会变成什么情况:

1商品18

+-----------------------------------+

14-12电器17-12 2+4食品13+4

+----------------------+ 15-12电冰箱16-12 3+4肉类8+4 9+4蔬菜类12+4

+-------------------+

4+4猪肉5+4 6+4牛肉7+4 10+4白菜11+4

大家仔细观察一下交换后同层2个节点和其所有子孙节点左右值的变化,可以发现一个明显的规律,那就是,节点“电器”及其所有子孙节点的左右值均减少12,而节点“食品”及其所有子孙节点的左右值均增加4。而节点“电器”+其子孙节点的数量为2,节点“食品”+其子孙节点的数量为6,这其中有什么联系吗?还记得我在删除节点的存储过程后面的注释吗?任何一个节点同时具有唯一的左值和唯一的右值。让我们把节点数量*2,正好和节点左右值需要调整的幅度相等。由此规律,我们可以编写出类似下面的存储过程来实现节点同层前移的功能:

CREATE PROCEDURE[dbo].[MoveNodeUp]

@type_id int

AS

declare@lft int

declare@rgt int

declare@layer int

if exists (select1from tree where type_id=@type_id)

begin

SET XACT_ABORT ON

BEGIN TRANSACTION

select@lft=lft,@rgt=rgt,@layer=layer from TreeView where type_id=@type_id

if exists (select*from TreeView where rgt=@lft-1and layer=@layer)

begin

declare@brother_lft int

declare@brother_rgt int

select@brother_lft=lft,@brother_rgt=rgt from TreeView where rgt=@lft-1an d layer=@layer

update tree set lft=lft-(@brother_rgt-@brother_lft+1) where lft>=@lft and rgt <=@rgt

update tree set lft=lft+(@rgt-@lft+1) where lft>=@brother_lft and rgt<=@br other_rgt

update tree set rgt=rgt-(@brother_rgt-@brother_lft+1) where rgt>@brother_ rgt and rgt<=@rgt

update tree set rgt=rgt+(@rgt-@lft+1) where lft>=@brother_lft+(@rgt-@lft+ 1) and rgt<=@brother_rgt

end

COMMIT TRANSACTION

SET XACT_ABORT OFF

end

注意:节点的同层平移可以采用临时表来做中介,降低代码的复杂度。不用临时表来处理也行,但是update语句顺序一定要考虑周详。否则,一旦出现bug,对整个类别表的破坏是惊人的,强烈推荐在做上述工作前对类别表进行完整备份。

同层下移的存储过程和同层上移类似,有兴趣的朋友可以自己动手编写体味一下其中的细节,我就不在这里列出来了。

最后,我对上面这种左右值编码实现无限分级类别树的方案做一个总结:

优点:在消除递归的前提下实现了无限分级,而且查询条件是基于整形数字比较的,效率很高。可以进行先序列表,添加,修改,删除,同层平移等常规操作,基本满足需求。

缺点:由于这种左右值编码的方式和常见的阿拉伯数字直观排序不同,再加上节点在树中的层次,顺序不是直观显示出来,而必须通过简单的公式计算后得到,需要花费一定的时间对其数学模型进行深入理解。而且,采用该方案编写相关存储过程,新增,删除,同层平移节点需要对整个树进行查询修改,由此导致的代码复杂度,耦合度较高,修改维护的风险较高。

发表于@ 2007年04月26日16:36:00|评论(4 )|编辑

新一篇: 自定义MembershipProvider来利用https://www.wendangku.net/doc/2613089349.html, 2.0 Login控件的登陆和修改密码模块 | 旧一篇: 分页存储过程的一点心得

老板心里你有多重?

确立职场位置,明确自身重要性Leo教你看清前途

老板心里你有多重?

确立职场位置,明确自身重要性Leo教你看清前途

评论

#hometohome 发表于2008-05-07 22:17:19 IP: 123.115.4.*

请问该如何根据子节点的type_id找出父节点呢?

比如:猪肉的父节点是肉类、食品、商品

#hometohome 发表于2008-05-07 22:38:54 IP: 123.115.4.*

declare @rgt int

select @rgt=rgt from tree where type_id=13

select * from tree where rgt>=@rgt and lft<=@rgt order by lft

我是楼上的。这么做可否?

#greki 发表于2008-10-11 17:49:40 IP: 125.122.194.*

非常感谢,试过很好用,

另外我不懂存储过程,

CREATE PROCEDURE [dbo].[GetTreeListByNode]

(

@type_id int --给定节点标识

)

AS

declare @lft int

declare @rgt int

if exists (select 1 from tree where type_id=@type_id)

begin

select @lft=lft,@rgt=rgt from tree where type_id=@type_id

select * from TreeView where lft between @lft and @rgt order by lft asc

end

go

这个改为返回结果集。select * from TreeView where lft between @lft and @rgt

order by lft asc

。怎么改

#Binlorima 发表于2008-11-17 16:08:20 IP: 220.231.42.*

看到你的这篇文章后,我有以下想法:

数据库结构:

id name index layer

---- --------- --------- -------

1 食品1 2

2 肉类2 3

3 猪肉3 4

4 蔬菜类4 3

5 白菜5 4

6 电器6 2

7 电视机7 3

8 电冰箱8 3

layer 1 2 3 4

————————————

index

1 |---食品

2 | |---肉类

3 | | |--猪肉

4 | |---蔬菜类

5 | |--白菜

6 |---电器

7 |--电视机

8 |--电冰箱

我认为这样存储更直观

而且不需要计算层级,更容易得出父节点及直接父节点

数据结构课程设计图的遍历和生成树求解

数学与计算机学院 课程设计说明书 课程名称: 数据结构与算法课程设计 课程代码: 6014389 题目: 图的遍历和生成树求解实现 年级/专业/班: 学生姓名: 学号: 开始时间: 2012 年 12 月 09 日 完成时间: 2012 年 12 月 26 日 课程设计成绩: 指导教师签名:年月日

目录 摘要 (3) 引言 (4) 1 需求分析 (5) 1.1任务与分析 (5) 1.2测试数据 (5) 2 概要设计 (5) 2.1 ADT描述 (5) 2.2程序模块结构 (7) 软件结构设计: (7) 2.3各功能模块 (7) 3 详细设计 (8) 3.1结构体定义 (19) 3.2 初始化 (22) 3.3 插入操作(四号黑体) (22) 4 调试分析 (22) 5 用户使用说明 (23) 6 测试结果 (24) 结论 (26)

摘要 《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的: ?了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; ?初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; ?提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 这次课程设计我们主要是应用以前学习的数据结构与面向对象程序设计知识,结合起来才完成了这个程序。 因为图是一种较线形表和树更为复杂的数据结构。在线形表中,数据元素之间仅有线性关系,每个元素只有一个直接前驱和一个直接后继,并且在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。因此,本程序是采用邻接矩阵、邻接表、十字链表等多种结构存储来实现对图的存储。采用邻接矩阵即为数组表示法,邻接表和十字链表都是图的一种链式存储结构。对图的遍历分别采用了广度优先遍历和深度优先遍历。 关键词:计算机;图;算法。

数据库表结构设计参考

数据库表结构设计参考

表名外部单位表(DeptOut) 列名数据类型(精度范围)空/非空约束条件 外部单位ID 变长字符串(50) N 主键 类型变长字符串(50) N 单位名称变长字符串(255) N 单位简称变长字符串(50) 单位全称变长字符串(255) 交换类型变长字符串(50) N 交换、市机、直送、邮局单位邮编变长字符串(6) 单位标识(英文) 变长字符串(50) 排序号整型(4) 交换号变长字符串(50) 单位领导变长字符串(50) 单位电话变长字符串(50) 所属城市变长字符串(50) 单位地址变长字符串(255) 备注变长字符串(255) 补充说明该表记录数约3000条左右,一般不做修改。初始化记录。 表名外部单位子表(DeptOutSub) 列名数据类型(精度范围)空/非空约束条件 外部子单位ID 变长字符串(50) N 父ID 变长字符串(50) N 外键 单位名称变长字符串(255) N 单位编码变长字符串(50) 补充说明该表记录数一般很少 表名内部单位表(DeptIn) 列名数据类型(精度范围)空/非空约束条件 内部单位ID 变长字符串(50) N 主键 类型变长字符串(50) N 单位名称变长字符串(255) N 单位简称变长字符串(50) 单位全称变长字符串(255) 工作职责 排序号整型(4) 单位领导变长字符串(50) 单位电话(分机)变长字符串(50) 备注变长字符串(255)

补充说明该表记录数较小(100条以内),一般不做修改。维护一次后很少修改 表名内部单位子表(DeptInSub) 列名数据类型(精度范围)空/非空约束条件内部子单位ID 变长字符串(50) N 父ID 变长字符串(50) N 外键 单位名称变长字符串(255) N 单位编码变长字符串(50) 单位类型变长字符串(50) 领导、部门 排序号Int 补充说明该表记录数一般很少 表名省、直辖市表(Province) 列名数据类型(精度范围)空/非空约束条件ID 变长字符串(50) N 名称变长字符串(50) N 外键 投递号变长字符串(255) N 补充说明该表记录数固定 表名急件电话语音记录表(TelCall) 列名数据类型(精度范围)空/非空约束条件ID 变长字符串(50) N 发送部门变长字符串(50) N 接收部门变长字符串(50) N 拨打电话号码变长字符串(50) 拨打内容变长字符串(50) 呼叫次数Int 呼叫时间Datetime 补充说明该表对应功能不完善,最后考虑此表 表名摄像头图像记录表(ScreenShot) 列名数据类型(精度范围)空/非空约束条件ID 变长字符串(50) N 拍照时间Datetime N 取件人所属部门变长字符串(50) N 取件人用户名变长字符串(50) 取件人卡号变长字符串(50) 图片文件BLOB/Image

数据库设计各阶段

1.数据库应用系统的设计步骤 按规范设计的方法可将数据库设计分为以下六个阶段 (1)需求分析; (2)概念结构设计; (3)逻辑结构设计; (4)数据库物理设计; (5)数据库实施; (6)数据库运行和维护。 2.需求分析 需求收集和分析是数据库应用系统设计的第一阶段。明确地把它作为数据库应用系统设计的第一步是十分重要的。这一阶段收集到的基础数据和一组数据流图(Data Flow Diaˉgram———DFD)是下一步设计概念结构的基础。概念结构对整个数据库设计具有深刻影响。而要设计好概念结构,就必须在需求分析阶段用系统的观点来考虑问题、收集和分析数据及其处理。如何分析和表达用户需求呢?在众多的分析方法中,结构化分析(Structured Analysis,简称SA方法)是一个简单实用的方法。SA方法用自顶向下、逐层分解的方式分析系统。用数据流图,数据字典描述系统。然后把一个处理功能的具体内容分解为若干子功能,每个子功能继续分解,直到把系统的工作过程表达清楚为止。在处理功能逐步分解的同时,它们所用的数据也逐级分解。形成若干层次的数据流图。数据流图表达了数据和处理过程的关系。处理过程的处理逻辑常常用判定表或判定树来描述。数据字典(Data Dictionary,简称DD)则是对系统中数据的详尽描述,是各类数据属性的清单。对数据库应用系统设计来讲,数据字典是进行详细的数据收集和数据分析所获得的主要结果。数据字典是各类数据描述的集合,它通常包括以下5个部分: (1)数据项,是数据最小单位。 (2)数据结构,是若干数据项有意义的集合。 (3)数据流,可以是数据项,也可以是数据结构。表示某一处理过程的输入输出。 (4)数据存储,处理过程中存取的数据。常常是手工凭证、手工文档或计算机文件。 (5)处理过程。

数据库设计说明书(文档格式)

数据库设计说明书 1. 引言 1.1 编写目的 阐明编写本数据库设计说明书的目的,指出读者对象。 1.2 项目背景 列出本项目的委托单位、开发单位和主管部门,说明该数据库系统与其他系统的关系。 1.3 定义 列出本文档中所用到的专门术语的定义和缩写词的原意。 1.4 参考资料 列出有关资料的作者、标题、编号、发表日期、出版单位或资料来源。包括本项目经核准的计划任务书、合同或上级机关的批文,项目开发计划,需求规格说明书,本文档需要引用的论文、著作,需要采用的标准、规范。 2. 外部设计 2.1 标识 列出用于标识该数据库的编码、名称、标识符或标号,并给出附加的描述性信息。如果该数据库是在实验中的或是暂时性的,则要说明其暂时性和有效期。 2.2 约定 叙述使用该数据库所必须了解的建立标号、标识的有关约定。例如用于标识库内各个文卷、记录、数据项的命名约定等。

2.3 使用该数据库的软件 列出将要使用或访问该数据库的所有软件。 2.4 支撑软件 叙述与此数据库有关的支撑软件,如数据库管理系统、存储定位程序等。概要说明这些支撑软件的名称、功能及为使用这些支撑软件所需的操作命令。列出这些支撑软件的有关资料。 2.5 专门说明 为此数据库的生成、测试、操作和维护的相关人员提供专门的说明。 3. 结构设计 3.1 概念结构设计 说明数据库的用户视图,即反映现实世界中的实体、属性和它们之间关系的原始数据形式,包括各数据项、记录、文卷的标识符、定义、类型、度量单位和值域。可使用ER图。 3.2 逻辑结构设计 说明把上述原始数据进行分解、合并后重新组织起来的数据库全局逻辑结构,包括记录、段的编排,记录、段之间的关系及存取方法等,形成本数据库的管理员视图。 3.3 物理结构设计 建立系统程序员视图,包括: (1) 数据在内存中的安排,包括索引区、缓冲区的设计。 (2) 所使用的外存设备及外存之间的组织,包括索引区、数据块的组织 与划分。 (3) 访问数据的方式方法。

c#窗体设计之树形文件结构

using System; using System.Collections.Generic; using https://www.wendangku.net/doc/2613089349.html,ponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace 树形窗体 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { folderBrowserDialog1.RootFolder= Environment.SpecialFolder.MyComputer; folderBrowserDialog1.ShowNewFolderButton = false; if(folderBrowserDialog1.ShowDialog()!=DialogResult.OK) return; TreeNode Node ; treeView1.Nodes.Clear(); Node = treeView1.Nodes.Add(folderBrowserDialog1.SelectedPath); createchildNode(Node); Node.Expand(); } private void createchildNode(TreeNode fu) { TreeNode child; string path=fu.Text;

数据库设计的基本步骤

数据库设计的基本步骤 一、数据库设计的生存期 按照规范设计的方法,考虑到数据库及其应用系统开发的全过程,将数据库 设计分为六个阶段。如下图。 ① 需求分析 需求收集和分析, 需求。 ② 概念结构设计 对需求进行综合、归纳与抽象,形成一个独立于具体 DBMS 的概念模型(用 E-R 图表示)。 ③ 逻辑结构设计 将概念结构转换为某个DBMS 所支持的数据模型(例如关系模型),并对其 进行优化。 ④ 物理结构设计 为逻辑数据模型选取一个最适合应用环境的物理结构 (包括存储结构和存取 方法)。 ⑤ 数据库实施 需求A 祈断段 T 1 概念设计阶段 i 逻辑 q 丰计阶段 1 物理. 1 殳计阶段 j 数据E L 支实施阶段 数据库运荷? 维护阶段 得到用数据字典描述的数据需求,用数据流图描述的处理

运用DBMS 提供的数据语言(例如 SQL )及其宿主语言(例如C),根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。 ⑥数据库运行和维护 数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。 说明:设计一个完善的数据库应用系统是不可能一蹴而就的,它往往是上述 六个阶段的不断反复。 二、数据库设计阶段的内容 设计步骤既是数据库设计的过程,也包括了数据库应用系统的设计过程。下面针对各阶段的设计内容给出各阶段的设计描述。如下图。 阶段 濮块结构) 三、数据库设计阶段的模式 数据库结构设计的不同阶段形成数据库的各级模式,如下图 需求数据字睦、全系统中数据项、 分析數据證、数据存储的描述 数1E流图和判定我(利宦 闕)、数据字典中处理过程的 描述 设计 概念模型〔E?兄图) 模块设计 IPO表 编写模武装入 数JE 实施数揭库试 运行阶段 Create … L o豆恋■?. 程序编码 编译联结 测试 Tlain () * ■ A if???then ■■ i HUl 数据宇典 系窥说朋书包括: ①新系统要求、 方案和概图 ②反映新系统信息 流的数据流图 方法选择物理 存取路径建立设计

数据库课后题答案 第7章 数据库设计

第7章数据库设计 1.试述数据库设计过程。 答:这里只概要列出数据库设计过程的六个阶段:( l )需求分析;( 2 )概念结构设计;( 3 )逻辑结构设计;( 4 )数据库物理设计;( 5 )数据库实施;( 6 )数据库运行和维护。这是一个完整的实际数据库及其应用系统的设计过程。不仅包括设计数据库本身,还包括数据库的实施、运行和维护。设计一个完善的数据库应用系统往往是上述六个阶段的不断反复。 2 .试述数据库设计过程各个阶段上的设计描述。 答:各阶段的设计要点如下:( l )需求分析:准确了解与分析用户需求(包括数据与处理)。( 2 )概念结构设计:通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS 的概念模型。( 3 )逻辑结构设计:将概念结构转换为某个DBMS 所支持的数据模型,并对其进行优化。( 4 )数据库物理设计:为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。( 5 )数据库实施:设计人员运用DBMS 提供的数据语言、工具及宿主语言,根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。( 6 )数据库运行和维护:在数据库系统运行过程中对其进行评价、调整与修改。 3 .试述数据库设计过程中结构设计部分形成的数据库模式。 答:数据库结构设计的不同阶段形成数据库的各级模式,即:( l )在概念设计阶段形成独立于机器特点,独立于各个DBMS 产品的概念模式,在本篇中就是 E 一R 图;( 2 )在逻辑设计阶段将 E 一R 图转换成具体的数据库产品支持的数据模型,如关系模型,形成数据库逻辑模式,然后在基本表的基础上再建立必要的视图( Vi 娜),形成数据的外模式;( 3 )在物理设计阶段,根据DBMS 特点和处理的需要,进行物理存储安排,建立索引,形成数据库内模式。 4 .试述数据库设计的特点。 答:数据库设计既是一项涉及多学科的综合性技术又是一项庞大的工程项目。其主要特点有:( l )数据库建设是硬件、软件和干件(技术与管理的界面)的结合。( 2 )从软件设计的技术角度看,数据库设计应该和应用系统设计相结合,也就是说,整个设计过程中要把结构(数据)设计和行为(处理)设计密切结合起来。 5 .需求分析阶段的设计目标是什么?调查的内容是什么? 答:需求分析阶段的设计目标是通过详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统(手工系统或计算机系统)工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能。调查的内容是“数据’夕和“处理”,即获得用户对数据库的如下要求:( l )信息要求,指用户需要从数据库中获得信息的内容与性质,由信息要求可以导出数据要求,即在数据库中需要存储哪些数据;( 2 )处理要求,指用户要完成什么处理功能,对处理的响应时间有什么要求,处理方式是批处理还是联机处理;( 3 )安全性与完整性要求。 6 .数据字典的内容和作用是什么? 答:数据字典是系统中各类数据描述的集合。数据字典的内容通常包括:( l )数据项;( 2 )数据结构;( 3 )数据流;( 4 )数据存储;( 5 )处理过程五个部分。其中数据项是数

二叉树的应用数据结构课程设计样本

信息科学与技术学院 数据结构课程设计报告 题目名称: 二叉树的应用专业班级: 计算机科学与技术学生姓名: 陈杰 学生学号: 指导教师: 高攀 完成日期: -04 目录

1、课程设计的目的、课程设计题目、题目要求错误!未定义书签。 1.1课程设计的目的 ............................................... 错误!未定义书签。 1.2课程设计的题目 ............................................... 错误!未定义书签。 1.3题目要求............................................................ 错误!未定义书签。2课程设计的实验报告内容:................................. 错误!未定义书签。3课程设计的原程序代码: ..................................... 错误!未定义书签。4运行结果 .............................................................. 错误!未定义书签。 5. 课程设计总结..................................................... 错误!未定义书签。6参考书目 .............................................................. 错误!未定义书签。

1课程设计的目的 1.1课程设计的目的: 经过以前的学习以及查看相关资料,按着题目要求编写程序,进一步加强对编程的训练,使得自己掌握一些将书本知识转化为实际应用当中.在整个程序中,主要应用的是链表,可是也运用了类.经过两种方法解决现有问题. 1.2课程设计的题目: 二叉树的应用 1.3题目要求: 1.建立二叉树的二叉链表存储算法 2.二叉树的先序遍历, 中序遍历和后序遍历输出 3.非递归的先序遍历, 中序遍历 4.二叉树的层次遍历 5.判断此二叉树是否是完全二叉树 6.二叉树的左右孩子的交换 2课程设计的实验报告内容: 7.经过递归对二叉树进行遍历。二叉树的非递归遍历主要采用利 用队进行遍历。此后的判断此二叉树是否是完全二叉树也才采

结构设计常用数据表格

建筑结构安全等级 2 纵向受力钢筋混凝土保护层最小厚度(mm) 不同根数钢筋计算截面面积(mm2)

板宽1000mm内各种钢筋间距时钢筋截面面积表(mm2) 每米箍筋实配面积 钢筋混凝土结构构件中纵向受力钢筋的最小配筋百分率(%) 框架柱全部纵向受力钢筋最小配筋百分率(%)

框架梁纵向受拉钢筋的最小配筋白分率(%) 柱箍筋加密区的箍筋最小配箍特征值λν(ρν=λνf/f)

受弯构件挠度限值 注:1 表中lo为构件的计算跨度; 2 表中括号内的数值适用于使用上对挠度有较高要求的构件; 3 如果构件制作时预先起拱,且使用上也允许,则在验算挠度时,可将计算所得的挠度值减去起拱值;对预应力混凝土构件,尚可减去预加力所产生的反拱值; 4 计算悬臂构件的挠度限值时,其计算跨度lo按实际悬臂长度的2倍取用。

注: 1 表中的规定适用于采用热轧钢筋的钢筋混凝土构件和采用预应力钢丝、钢绞线及热处理钢筋的预应力混凝土构件;当采用其他类别的钢丝或钢筋时,其裂缝控制要求可按专门标准确定; 2 对处于年平均相对湿度小于60%地区一类环境下的受弯构件,其最大裂缝宽度限值可采用括号内的数值; 3 在一类环境下,对钢筋混凝土屋架、托架及需作疲劳验算的吊车梁,其最大裂缝宽度限值应取为0.2mm;对钢筋混凝土屋面梁和托梁,其最大裂缝宽度限值应取为0.3mm; 4 在一类环境下,对预应力混凝土屋面梁、托梁、屋架、托架、屋面板和楼板,应按二级裂缝控制等级进行验算;在一类和二类环境下,对需作疲劳验算的须应力混凝土吊车梁,应按一级裂缝控制等级进行验算; 5 表中规定的预应力混凝土构件的裂缝控制等级和最大裂缝宽度限值仅适用于正截面的验算;预应力混凝土构件的斜截面裂缝控制验算应符合本规范第8章的要求; 6 对于烟囱、筒仓和处于液体压力下的结构构件,其裂缝控制要求应符合专门标准的有关规定; 7 对于处于四、五类环境下的结构构件,其裂缝控制要求应符合专门标准的有关规定; 8 表中的最大裂缝宽度限值用于验算荷载作用引起的最大裂缝宽度。 梁内钢筋排成一排时的钢筋最多根数

二叉树数据结构课程设计

目录 第一章需求分析 (1) 1.1课程设计题目 (1) 1.2 课程设计任务及要求 (1) 1.21 课程设计目的 (1) 1.22设计要求 (1) 1.3课程设计思想 (2) 1.4软件运行环境及开发工具 (2) 第二章概要设计 (3) 2.1 数据结构 (3) 2.2 所用方法及其原理说明 (3) 第三章详细设计 (4) 3.1详细设计方案 (4) 3.2 模块设计 (4) 3.21二叉树定义 (4) 3.22 树状显示二叉树设计 (7) 3.22 主函数设计 (10) 第四章调试和操作说明 (11) 4.1 调试 (11) 4.2 操作说明 (12) 第五章总结与体会 (12) 5.1本文的主要工作 (12) 5.2 存在问题 (12) 5.3心得体会 (12) 致谢 (13) 参考文献 (14)

第一章需求分析 1.1课程设计题目 树状显示二叉树: 编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。 [问题描述] 假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用 (层号,须打印的空格数)来界定。 第0层:根在(0,32)处输出; 第1层:因为根节点缩进了32个空格,所以下一层的偏移量(offset)为32/2=16=screenwidth/22。即第一层的两个节点的位置为(1,32-offset),(1,32+offset)即(1,16),(1,48)。 第二层:第二层的偏移量offset为screenwidth/23。第二层的四个节点的位置分别是(2,16-offset),(2,16+offset),(2,48-offset),(2,48+offset)即(2,8),(2,24),(2,40),(2,56)。 …… 第i层:第i层的偏移量offset为screenwidth/2i+1。第i层的每个节点的位置是访问第i-1层其双亲节点时确定的。假设其双亲的位置为(i-1,parentpos)。若其第i层的节点是其左孩子,那末左孩子的位置是(i,parentpos-offset),右孩子的位置是(i,parentpos+offset)。 [实现提示] 利用二叉树的层次遍历算法实现。利用两个队列Q,QI。队列Q中存放节点信息,队列QI中存相应于队列Q中的节点的位置信息,包括层号和需要打印节点值时需要打印的空格数。当节点被加入到Q时,相应的打印信息被存到QI中。二叉树本身采用二叉链表存储。 1.2 课程设计任务及要求 1.21 课程设计目的 据结构是计算机专业的核心课程,是一门实践性很强的课程。课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C(C++)程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。 1.22设计要求 1、课程设计题目每组一题,每个学生必须独立完成; 2、课程设计时间为2周; 3、设计语言C(C++)不限; 1

进销存数据库表结构设计

1.帐类表(KIND) 无索引 序号中文名称英文名称类型备注 1 帐类编号K_SERIAL byte 2 帐类名称K_NAME text*10 本表系统自动建立,共划分为15种帐类,不可增删 帐类编号帐类名称备注 0 上期结存进货,不参加进货统计 1 购入进货,购入时必需输入供货单位名称 2 自制进货 3 投资转入进货 4 盘盈进货 5 领料出库,领料必需输入领料部门名称 6 调拨出库 7 报损出库 8 盘亏出库 9 退库对低值易耗品,在用品退为在用库存 10 直接报废对于低值易耗品,在用品转报废 11 领用对于低值易耗品,在用库存转在用 12 调拨对于低值易耗品,在用库存减少 13 报废对于低值易耗品,在用库存报废 14 直进直出进出库,购入与领料对库存无影响 2.物品表(GOODS) 序号索引名称索引域唯一? 主索引? 1 G_CODING +G_CODING Y N 2 G_SERIAL +G_SERIAL Y Y 序号中文名称英文名称类型备注 1 物品内部编号G_SERIAL INT->long 系统内部唯一标识该物品 2 物品编号G_CODING TEXT * 10 用户使用此编号访问物品 &3 物品名称G_NAME TEXT*40 非空 &4 物品单位G_UNIT TEXT*8 非空 &5 物品规格G_STATE TEXT*20

6 物品类别G_CLASS INT 取自表CLASS 7 备注G_REMARKS MEMO 8 最小库存量G_MIN CURRENCY 为零,即无最小库存 9 最大库存量G_MAX CURRENCY 为零,即无最大库存 10 库存数量G_QUANT CURRENCY 控制出库数量 11 虚拟库存数量G_VQUANT CURRENCY 出库时用 12 库存金额G_AMOUNT CURRENCY 3.类别表(CLASS) 序号索引名称索引域唯一? 主索引? 1 C_CODING +C_CODING Y N 2 C_SERIAL +C_SERIAL Y Y 序号中文名称英文名称类型备注 1 类别内部序号C_SERIAL INT 系统内部唯一标识该物品 2 类别编号C_CODING TEXT *10 用户使用该编号访问类别信息 3 类别名称C_NAME TEXT*20 非空 4 出库类型C_KIND BYTE 1.移动平均 2..先进先出 3.后进先出 4.实际计价 *5.月末平均 5 备注C_REMARKS MEMO *6 底标志C_BOTTOM BOOLEAN *7 类别级别C_LEVEL BYTE 4.供货单位、使用部门(DEPART) 序号索引名称索引域唯一? 主索引? 1 D_CODING +D_CODING Y N 2 D_SERIAL +D_SERIAL Y Y 序号中文名称英文名称类型备注 1 内部序号D_SERIAL INT 系统内部唯一标识该部门 >0 供货单位 =0 库房 <0 使用部门 2 单位编号D_CODING TEXT*10

数据库设计文档

学院 ~ 数据库课程设计报告$ ( ) 电子技术系 ! 专业班级 学生姓名 指导教师 . 实习地点

# / 数据库设计文档 一、系统需求分析报告(数据流图、数据词典和功能分析) 系统应具有售票、查询、管理和维护等功能,系统管理员可以进行对车次的更改、票价的变动及调度功能,票价的修改可以通过修改运价来进行,车次调度可通过对发车时刻表的修改来进行,维护功能即可对表进行修改。 1、功能需求 经过分析后确定系统应具备以下功能: — (1)、售票功能 ①销售车票 ②预订车票 ③退票 (2)、查询功能 ①— ②车次查询 ③时刻表查询 ④售票情况查询 (3)、调度功能 ①运价修改 ②~ ③车辆修改 ④终点站修改 ⑤车次修改 (4)、维护功能 ①车票表修改 ②— ③预订车票表修改 ④退票表修改

⑤密码修改 (5)、统计功能 ①售票统计 ②¥ ③报表打印 2、数据流图 使用结构化分析方法,确定系统的数据主要是运价、车次、终点站名、发车时间和车票,对数据的操作主要有运价修改、车次修改、终点站修改、发车时间修改、售票及打印,可以确定系统的处理逻辑和流程,得到如下所示的系统数据流图。 ) 3、数据字典: 经过分析可以得到以下数据流条目: 车次表=车辆编号+车型+座位数 终点站名表=站名+里程 运价表=车型+运价 { 发车时刻表=车次+车辆编号+站名+发车时间+检票口

已售车票表=票号+乘车日期+车次+站名+发车时间+票价+全半价+工号+退票否 预订车票表=预订号+乘车日期+车次+站名+发车时间+车型+票价+客户名称+订票数量退票表=票号+退票时间+票价+应退款 售票员编号=工号+姓名 ) 车辆编号=6{数字}6 车次=4{字符}5 车型=1{字符}8 座位数=2{数字}2 检票口=1{数字}2 ` 站名=1{字符}10 里程=1{数字}5 运价=1{数字}6 发车时间={时间} 乘车日期={日期} , 票号=7{数字}7 票价=1{数字}5 全半价=2{字符}2 退票否={T|F} 预订号=4{数字}4 % 客户名称=6{字符}20 订票数量=1{数字}2 退票时间={日期时间} 应退款=1{数字}5 工号=3{字符}3 》 姓名=4{字符}8 二、数据逻辑结构设计(E-R图、关系模式和数据库结构) 1、E—R图

数据结构课程设计报告,含菜单

算法与数据结构课程设计 报告 系(院):计算机科学学院 专业班级:计科11005 姓名:张林峰 学号: 201003784 指导教师:詹泽梅 设计时间:2012.6.11 - 2012.6.18 设计地点:12教机房

目录 一、课程设计目的 (2) 二、设计任务及要求 (2) 三、需求分析 (2) 四、总体设计 .............. 错误!未定义书签。 五、详细设计与实现[含代码和实现界面].. 8 六、课程设计小结 (15)

一.设计目的 1.能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。 2.提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。 3.初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。 4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 5.培养根据选题需要选择学习书籍,查阅文献资料的自学能力。二.设计任务及要求 根据《算法与数据结构》课程的结构体系,设计一个基于DOS菜单的应用程序。要利用多级菜单实现各种功能。比如,主界面是大项,主要是学过的各章的名字诸如线性表、栈与队列、串与数组及广义表等,子菜单这些章中的节或者子节。要求所有子菜单退出到他的父菜单。编程实现时,要用到C++的面向对象的功能。 三.需求分析 菜单运用极其广泛,应用于各行各业。菜单运用起来极其方便。随着社会的发展,社会的行业出现多样化,也就需要各式

数据库设计文档

— 学院 数据库课程设计报告> < 电子技术系 ~ 专业班级 学生姓名 指导教师 实习地点 (

: 数据库设计文档 一、系统需求分析报告(数据流图、数据词典和功能分析) 系统应具有售票、查询、管理和维护等功能,系统管理员可以进行对车次的更改、票价的变动及调度功能,票价的修改可以通过修改运价来进行,车次调度可通过对发车时刻表的修改来进行,维护功能即可对表进行修改。 1、功能需求 经过分析后确定系统应具备以下功能: (1)、售票功能 ①销售车票 ②预订车票 ③' ④退票 (2)、查询功能 ①车次查询 ②时刻表查询 ③售票情况查询 (3)、调度功能 ①运价修改 ②车辆修改 ③( ④终点站修改 ⑤车次修改 (4)、维护功能 ①车票表修改 ②预订车票表修改 ③退票表修改 ④密码修改 (5)、统计功能 ①、 ②售票统计

③报表打印 2、数据流图 使用结构化分析方法,确定系统的数据主要是运价、车次、终点站名、发车时间和车票,对数据的操作主要有运价修改、车次修改、终点站修改、发车时间修改、售票及打印,可以确定系统的处理逻辑和流程,得到如下所示的系统数据流图。 、 3、数据字典: 经过分析可以得到以下数据流条目: 车次表=车辆编号+车型+座位数 终点站名表=站名+里程 运价表=车型+运价 发车时刻表=车次+车辆编号+站名+发车时间+检票口 已售车票表=票号+乘车日期+车次+站名+发车时间+票价+全半价+工号+退票否) 预订车票表=预订号+乘车日期+车次+站名+发车时间+车型+票价+客户名称+订票数量退票表=票号+退票时间+票价+应退款 售票员编号=工号+姓名

车辆编号=6{数字}6 车次=4{字符}5 车型=1{字符}8 座位数=2{数字}2 检票口=1{数字}2 ¥ 站名=1{字符}10 里程=1{数字}5 运价=1{数字}6 发车时间={时间} 乘车日期={日期} 票号=7{数字}7 票价=1{数字}5 全半价=2{字符}2 ( 退票否={T|F} 预订号=4{数字}4 客户名称=6{字符}20 订票数量=1{数字}2 退票时间={日期时间} 应退款=1{数字}5 工号=3{字符}3 姓名=4{字符}8 二、! 三、数据逻辑结构设计(E-R图、关系模式和数据库结构) 1、E—R图 》

数据库结构设计

一、数据库结构设计步骤 二、需求分析 三、概念结构设计 四、逻辑结构设计 五、数据库物理设计 数据库结构设计 一、数据库结构设计步骤 一般可将数据库结构设计分为四个阶段,即需求分析、概念结构设计、逻辑结构设计和物理设计。 下面各节分别介绍各阶段设计内容和具体方法。 二、需求分析 需求分析的任务是具体了解应用环境,了解与分析用户对数据和数据处理的需求,对应用系统的性能的要求,提出新系统的目标,为第二阶段、第三阶段的设计奠定基础。一般需求分析的操作步骤如下所述。 1.了解组织、人员的构成 子系统的划分常常以现有组织系统为基础,再进行整合,而新系统首先必须达到的目的是尽可能地完成当前系统中有关信息方面的工作,在原有系统中,信息处理总是由具体人来实施的。我们要了解组织结构情况、相互之间信息沟通关系、数据(包括各种报告、报表、凭证、单据)往来联系情况。 具体弄清各个数据的名称,产生的时间与传递所需时间与周期,数据量的大小,所涉及(传送)的范围,使用数据的权限要求,数据处理过程中容易发生的问题及其影响,各个部门所希望获得的数据的情况等。 然后了解每个人对每一具体数据处理的过程,基本数据元素来源于哪些地方、获取的途径、处理的要求、数据的用途,进而弄清数据的构成、数据元素的类型、性质、算法、取值范围、相互关系。 在上述调查基础上,首先画出组织机构及工作职能图。我们以一个学校的基层单位——某大学一个系的管理为例来简要说明。 系的组织机构及工作职能如图7.1所示。

图7.1 系管理体系结构图 作为管理层经常需要的信息和工作有: .查询老师个人基本情况及打印相应内容 .查询与统计科研项目情况及相关报表 .查询与统计论文著作情况及相关报表 .上级部门及其他部门来文管理与查询(要求能全文检索) .系部发文管理 .任务下达、检查及管理 .信件、通知的收发及管理 .日程安排调度及管理 .设备仪器计划及管理 .设备入库与库存情况管理与查询 .设备借还领用管理及相应报表 .耗材计划与领发管理及相应统计报表 .图书管理及借还情况查询 .学生毕业设计文档管理 .专业与班组编制与查询 .教学文档管理及查询(安排与检查,包括课表、考试日程安排、监考安排等).学生成绩管理与查询和统计 .教师、学生、实验室课表管理及查询 .学生基本情况管理与查询(包括社会活动、奖惩、家庭情况及学校校友管理)

数据库设计文档模板

数据库设计说明书模板 修订历史 版本 说明 编制 批准日期 1引言 1.1编写目的 说明编写这份数据库设计说明书的目的,指出预期的读者。 1.2背景 说明: a.说明待开发的数据库的名称和使用此数据库的软件系统的名称; b.列出该软件系统开发项目的任务提出者、用户以及将安装该软件和这个数据库的计算站(中心)。 1.3定义 列出本文件中用到的专门术语的定义、外文首字母组词的原词组。 1.4参考资料 列出有关的参考资料: a.本项目的经核准的计划任务书或合同、上级机关批文; b.属于本项目的其他已发表的文件; c.本文件中各处引用到的文件资料,包括所要用到的软件开发标准。 列出这些文件的标题、文件编号、发表日期和出版单位,说明能够取得这些文件的来源。

2外部设计 2.1标识符和状态 联系用途,详细说明用于唯一地标识该数据库的代码、名称或标识符,附加的描述性信息亦要给出。如果该数据库属于尚在实验中、尚在测试中或是暂时使用的,则要说明这一特点及其有效时间范围。 2.2使用它的程序 列出将要使用或访问此数据库的所有应用程序,对于这些应用程序的每一个,给出它的名称和版本号。 2.3约定 陈述一个程序员或一个系统分析员为了能使用此数据库而需要了解的建立标号、标识的约定,例如用于标识数据库的不同版本的约定和用于标识库内各个文卷、、记录、数据项的命名约定等。 2.4专门指导 向准备从事此数据库的生成、从事此数据库的测试、维护人员提供专门的指导,例如将被送入数据库的数据的格式和标准、送入数据库的操作规程和步骤,用于产生、修改、更新或使用这些数据文卷的操作指导。如果这些指导的内容篇幅很长,列出可参阅的文件资料的名称和章条。 2.5支持软件 简单介绍同此数据库直接有关的支持软件,如数据库管理系统、存储定位程序和用于装入、生成、修改、更新数据库的程序等。说明这些软件的名称、版本号和主要功能特性,如所用数据模型的类型、允许的数据容量等。列出这些支持软件的技术文件的标题、编号及来源。 3结构设计 3.1概念结构设计 说明本数据库将反映的现实世界中的实体、属性和它们之间的关系等的原始数据形式,包括各数据项、记录、系、文卷的标识符、定义、类型、度量单位和值域,建立本数据库的每一幅用户视图。

结构设计常用数据表格

建筑结构安全等级 混凝土强度设计值(N/mm2) 纵向受力钢筋混凝土保护层最小厚度(mm) 每米箍筋实配面积 钢筋混凝土结构构件中纵向受力钢筋的最小配筋百分率(%)

框架柱全部纵向受力钢筋最小配筋百分率(%) 框架梁纵向受拉钢筋的最小配筋白分率(%) 柱箍筋加密区的箍筋最小配箍特征值λν(ρν=λνf)

注:1 表中lo为构件的计算跨度; 2 表中括号内的数值适用于使用上对挠度有较高要求的构件; 3 如果构件制作时预先起拱,且使用上也允许,则在验算挠度时,可将计算所得的挠度值减去起拱值;对预应力混凝土构件,尚可减去预加力所产生的反拱值; 4 计算悬臂构件的挠度限值时,其计算跨度lo按实际悬臂长度的2倍取用。

注: 1 表中的规定适用于采用热轧钢筋的钢筋混凝土构件和采用预应力钢丝、钢绞线及热处理钢筋的预应力混凝土构件;当采用其他类别的钢丝或钢筋时,其裂缝控制要求可按专门标准确定; 2 对处于年平均相对湿度小于60%地区一类环境下的受弯构件,其最大裂缝宽度限值可采用括号内的数值; 3 在一类环境下,对钢筋混凝土屋架、托架及需作疲劳验算的吊车梁,其最大裂缝宽度限值应取为0.2mm;对钢筋混凝土屋面梁和托梁,其最大裂缝宽度限值应取为0.3mm; 4 在一类环境下,对预应力混凝土屋面梁、托梁、屋架、托架、屋面板和楼板,应按二级裂缝控制等级进行验算;在一类和二类环境下,对需作疲劳验算的须应力混凝土吊车梁,应按一级裂缝控制等级进行验算; 5 表中规定的预应力混凝土构件的裂缝控制等级和最大裂缝宽度限值仅适用于正截面的验算;预应力混凝土构件的斜截面裂缝控制验算应符合本规范第8章的要求; 6 对于烟囱、筒仓和处于液体压力下的结构构件,其裂缝控制要求应符合专门标准的有关规定; 7 对于处于四、五类环境下的结构构件,其裂缝控制要求应符合专门标准的有关规定; 8 表中的最大裂缝宽度限值用于验算荷载作用引起的最大裂缝宽度。 梁内钢筋排成一排时的钢筋最多根数

[TREE]采用左右值编码来存储无限分级树形结构的数据库表设计

采用左右值编码来存储无限分级树形结构的数据库表设计 之前我介绍过一种按位数编码保存树形结构数据的表设计方法,详情见:浅谈数据库设计技巧(上) 该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由于层信息位数的限制,限制了每层能所允许的最大子节点数量及最大层数。同时,在添加新节点的时候必须先计算新节点的位置是否超过最大限制。 上面的设计方案必须预先设定类别树的最大层数以及最大子节点数,不是无限分级,在某些场合并不能采用,那么还有更完美的解决方案吗?通过google的搜索,我又探索到一种全新的无递归查询,无限分级的编码方案——左右值。原文的程序代码是用php写的,但是通过仔细阅读其数据库表设计说明及相关的sql语句,我彻底弄懂了这种巧妙的设计思路,并在这种设计中新增了删除节点,同层平移的需求(原文只提供了列表及插入子节点的sql语句)。 下面我力图用比较简短的文字,少量图表,及相关核心sql语句来描述这种设计方案: 首先,我们弄一棵树作为例子: 商品 |---食品 | |---肉类 | | |--猪肉 | |---蔬菜类 | |--白菜 |---电器 |--电视机 |--电冰箱

select count(*) from tree where lft <= 2 and rgt >= 11 为了方便列表,我们可以为tree表建立一个视图,添加一个层数列,该类别的层数可以写一个自定义函数来计算。该函数如下: CREATE FUNCTION dbo.CountLayer ( @type_id int ) RETURNS int AS begin declare@result int set@result=0 declare@lft int declare@rgt int if exists (select1from tree where type_id=@type_id) begin select@lft=lft,@rgt=rgt from tree where type_id=@type_id select@result=count(*) from tree where lft <=@lft and rgt >=@rgt end return@result end GO 然后,我们建立如下视图: CREATE VIEW dbo.TreeView AS SELECT type_id, name, lft, rgt, dbo.CountLayer(type_id) AS layer FROM dbo.tree ORDE R BY lft GO

相关文档
相关文档 最新文档