精华内容
下载资源
问答
  • 本文成文于2014年2月,背景是TiEAF(基础业务平台)设计之初“模型树”的存储方式选型。笔者在文中对关系数据库中常用树型结构的存储方式进行了描述和辨析。现将其整理发表以供读者参考。

    本文来自李明子csdn博客(http://blog.csdn.net/free1985),商业转载请联系博主获得授权,非商业转载请注明出处!

    1 前言

    本文成文于2014年2月,背景是TiEAF(基础业务平台)设计之初“模型树”的存储方式选型。笔者在文中对关系数据库中常用的树型结构的存储方式进行了描述和辨析。现将其整理发表以供读者参考。

    2 存储方式

    树型数据数据在关系数据库中的常用存储方式主要分有双亲表方式、层次表方式、先根遍历树表方式、扩展的线索二叉树表方式等四种。另外,还有双亲与层次表结合方式、带有层号的先根遍历树表、先根遍历层次兄弟树表方式三种变种,前一种是双亲表方式和层次表方式的结合,后两种是先根遍历树表方式的扩展。
    下面将简述各种存储方式的数据库表结构及对应算法的利弊。
    2.1 双亲表方式
    双亲表方式是最为常见的树型数据在关系数据库中的存储方式,使用也最为广泛。该方式主要通过记录节点及该节点的父节点来维护整棵数据树的结构关系,表结构如表2-1所示。

    表2-1  双亲表的结构

    采用这种方式的优点在于可以方便的对树型结构中的节点进行增加、删除、修改等操作,涉及变动的记录数较少,且数据库存储开销也很小。但它的缺点也是显而易见的。例如,对于无差别子孙集合的获取需要递归;获取节点从根节点起的路径同样需要递归追溯,时间开销较大。
    2.2 层次表方式
    层次表方式的思路也较为简洁,通过记录节点编号和从根节点起到目标节点的路径来存储树型结构的关系,其中路径由节点编号的序列组成。该方式的表结构如表2-2所示。

    表2-2  层次表的结构

    表2-2只是层次表的基本结构,因为涉及到路径的编码规则,所以层次表方式在实现时有几种不同的具体形式。比如,在节点较少,编号较短的情况下节点路径可以考虑直接使用无层次差别的节点编号;在节点数较多的时候,可以考虑以层次号为基准对节点进行编号。此时一个节点的唯一编号其实由“层次号”+“该层次上的节点号”组成,需要增加“层次号”字段。当然,即使路径使用无层次差别的统一节点编号,也可以用“层次号”来标识节点深度,以便更快的查询特定深度级别的节点,如根节点。
    通过以上描述可以看出,层次表结构方式有着无需递归就可以方便地实现各种常用树型结构查询的优点。但它的缺点同样十分突出。首先,对于更改树型数据层次结构的操作,尤其是更改位于数据树较高层次的节点时会引起大量记录的修改,这个时间开销十分巨大。其次,路径的表达也有一些棘手的问题。路径字段的长度设置限制了树型结构的层次深度;节点的编码方式也可能影响到每个层次上节点的最大数量。
    2.3 先根遍历树表方式
    先根遍历树表方式的主要思想是通过记录先根遍历中的第一次访问节点时的次序号(以下称左值)与回溯时第二次访问的次序号(以下称右值)来维护树型结构的层次关系。由先根遍历的概念可知,子节点的左值必然大于父节点左值,而右值必然小于父节点的右值。再结合排序操作就可以很容易的在不递归的情况下对树型数据进行各种查询操作。该方式的表结构如表2-3所示。

    表2-3  先根遍历树表的结构

    2.4 扩展的线索二叉树表方式
    扩展的线索二叉树表方式是在双亲表的基础上进行的改进,主要增加了按照深度搜索顺序的节点访问序号。该方式的表结构如表2-4所示。

    表2-4  扩展的线索二叉树表方式

    该方式可以看做是双亲表方式和先根遍历树表方式的折中方式。
    2.5 双亲与层次表结合方式
    该方式使用两张表,通过触发器同步来实现双亲表与层次表两种方式的结合,这种混合方式继承了两种方式的优点和缺点。
    2.6 带有层号的先根遍历树表方式
    带有层号的先根遍历树表在先根遍历树表方式的基础上增加了层号字段Level。该方式的表结构如表2-5所示。

    表2-5  带有层号的先根遍历树表的结构

    额外记录的层号降低了查询直接(父)子节点的时间复杂度。直观上讲,获取指定节点层次号时,对于有层次号的先根遍历树可以直接从Level字段取值;对于没有层号的先根遍历树需要编写如下查询:

    select count(*) + 1 as levelnum from tree t where t.left < (select m.left from tree m where m.name='C') and t.right > (select m.right from tree m where m.name='C')

    2.7 先根遍历层次兄弟树表方式
    先根遍历层次兄弟树表方式是先根遍历树表方式的扩展,在原有字段基础上增加了节点编号、层次深度与右兄弟节点编号三个字段。该方式的表结构如表2-6所示。

    表2-6  先根遍历层次兄弟树表的结构

    该方式增加了额外的空间开销来满足有序树获取右兄弟等操作。

    3 总结

    通过对以上各方式的辨析,我们认为第六种方式,即带有层号的先根遍历树表方式从算法角度考虑最优,能够满足一般业务系统中树型结构数据的访问操作。其时间开销与空间开销都较为出色,当然对于树型结构的修改会引起大量记录的连带修改问题无法回避。第四种方式,即扩展的线索二叉树表方式与第五种方式,即双亲与层次表结合方式这两种折中策略,在无法提供最优解的情况下反而增加了实现难度。而七种方式即先根遍历层次兄弟树表方式除在特定使用环境下并没有比第三种方式提供更多的优势。

    展开全文
  • *每个表空间可以存储一个或者多个段(segment) *每个段由一个或者多个区段(extent)所组成。 *每个区段是由一个或者多个连续数据块所组成。 *每个Oracle数据块是由1个或多个连续操作系统数据块所组成。 每个...

    Oracle存储器之间的关系:
    *每个数据库由一个或者多个表空间组成(至少一个)
    *每个表空间是基于一个或者多个操作系统的数据文件(至少一个)
    *每个表空间中可以存储一个或者多个段(segment)
    *每个段由一个或者多个区段(extent)所组成。
    *每个区段是由一个或者多个连续的数据块所组成。
    *每个Oracle数据块是由1个或多个连续的操作系统数据块所组成。
    每个操作系统数据文件是由一个或者多个区段所组成。
    每个操作系统数据文件是由一个或多个操作系统数据块所组成。

     

     


     

    展开全文
  • 树形数据在关系数据库的存储

    千次阅读 2014-03-25 15:34:34
    树形数据在关系数据库中的存储同对象一样,都会遇到一个"阻抗不匹配"问题。如何设计一个表结构,才能较好满足需求呢?事实上,有很多解决方案,但是没有哪一种是放之四海而皆准。我个人认为解决方案选择,...

      树形数据在关系数据库中的存储同对象一样,都会遇到一个"阻抗不匹配"的问题。如何设计一个表结构,才能较好的满足需求呢?

      事实上,有很多解决方案,但是没有哪一种是放之四海而皆准的。我个人认为解决方案的选择,必须依赖于需求背景。抛弃需求背景而就技术泛泛而谈,就如同孔乙己对回字不同写法的孜孜追求,满身酸腐之气。

      凡事有得就有失,十全十美的方案是不存的,合适的就是最好的。

    下面就集中常见的方案做一下比对,然后详细分析一下第四种方案。

    方案一:parent_id

    Pros:

    • 非常容易实现
    • 很方便的将子树移动到另外一个节点
    • 添加节点非常简单

    Cons:

    • 检索整棵树需要使用递归,非常耗费时间
    • 查找指定节点的所有父(子)节点同样要使用递归,非常耗费时间
    方案二:  Path栏位
    表添加Path栏位,每个节点记录从根节点到自身的一个路径。
    Pros:
    • 很容易查找所有父子节点
    • 很容易检索整棵树
    • 添加节点很简单
    Cons:
    • 移动子树比较麻烦,会导致大量数据更新
    • 取决于path的存储方式,可能需要对path进行解析

    方案三:Path表
    建立一个表,记录节点和其所有父节点的关联关系。
    Pros:
    • 很容易查找所有父子节点
    • 很容易检索整棵树
    Cons:
    • 添加节点很麻烦,需要同时产生很多关联关系
    • 移动子树导致大量数据操作
    • 数据量可能很庞大
    方案四: 预排序遍历树算法(modified preorder tree traversal algorithm)
    Pros:
    • 很容易查找所有父子节点
    • 很容易检索整棵树
    • 直接使用SQL就可以得到相关的数据
    • 存储方式决定了子节点都是有序存储的
    Cons:
    • 新增,更新,移动都很复杂,每次都会变更非常多的数据

    第四种方案的算法的图例如下,这个图例比较难以理解,我另外做了个图例,以矩形嵌套来描述它。如下面的图一图二:



                                                                  (图一)


    (图二)

    图二中的节点以矩形嵌套矩形的方式来描述父子关系,每个框代表一个节点,左右边框各记录一个值。值的维护从左到右依次递增。
    这个图例很容易看出如何使用一个节点的左右边界值来查找其子节点。

    我们转成二维表,看看数据库的存储形式:

    Parent Title lft rgt

    Food 1 18
    Food Fruit 2 11
    Fruit Red 3 6
    Red Cherry 4 5
    Fruit Yellow 7 10
    Yellow Banana 8 9
    Food Meat 12 17
    Meat Beef 13 14
    Meat Pork 15 16

    下面我们来看看树上的典型操作如何实现:

    1. 检索树
    给定一个节点,查找该节点及其子节点的sql:
    SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;

    2. 查找所有父节点
    所有父节点的特征是左边值小于当前节点的左值,右边值大于当前节点的右值
    SELECT title FROM tree WHERE lft < 4 AND rgt > 5 ORDER BY lft ASC;

    3. 查找路径 Food > Cherry
    select * from tree where lft between 1 and 4 and rgt between 5 and 18 order by lft
    改变lft的排序方式,即可实现从父节点>子节点,或者子节点到父节点


    4. 计算子节点的数目
    每个子节点占2个数据,计算公式如下。判断当前节点是否叶子节点,或者有多少个子节点,可以根据下面的公式
    descendants = (right - left - 1) / 2

    5. 新增子节点
    以在Food>Fruit>Yellow 右边再增加一个新的兄弟节点Black为例子
    1) 父节点的右边值为11. 新节点的左右值应该为 11, 12
    2) 变更所有的受影响的节点,给新节点腾出空位子。
    所有左节点>=11的,都增加2
    update tree set lft = lft + 2 where lft>=11
    所有右节点>=11的,都增加2
    update tree set rgt = rgt + 2 where rgt>=11
    3) 新节点放到空位上,左右边值分别为11,12
    INSERT INTO tree SET lft=11, rgt=12, title='Black'

    6. 删除子节点
    以删除Food>Fruit>Red 节点为例子
    1) 删除子节点及其下面所有节点
    delete from tree where lft >= 3 and rgt <= 6
    2) 变更所有的受影响的节点. 
    所有左节点大于6的减去4 (rgt - lft + 1)
    update tree set lft = lft - 4 where lft > 6
    所有右节点大于6的减去4
    update tree set rgt = rgt - 4 where rgt> 6

    7. 移动子节点
    以将Food>Fruit>Yellow  移动到 Food>Meat>Pork下为例子:
    要移动的节点是(7,11),目标节点是(15,16)
    1) 以目标节点的Pork为参考,变更要移动节点的值
    update tree set lft = lft + 9, rht=rgt + 9 where lft >=7 and rgt<=11
    2) 原节点所在位置以被删除看待
    所有左节点大于11的减去5 (rgt - lft + 1)
    update tree set lft = lft - 5 where lft > 11
    所有右节点大于11的减去5
    update tree set rgt = rgt - 5 where rgt> 11

    可以看出这种方法的最大优势是提升了读的性能,但是牺牲了写的性能,而且写的时候必须锁表。

    以下资料供参考:

    展开全文
  • 然而目前各种基于关系的数据库,都是以二维表形式记录存储数据信息,因此是不能直接将Tree存入DBMS,设计合适Schema及其对应CRUD算法是实现关系数据库中存储树形结构关键。 理想中树形结构应该...

    树形结构的数据库表Schema设计


        程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门、栏目结构、商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化。然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,因此是不能直接将Tree存入DBMS,设计合适的Schema及其对应的CRUD算法是实现关系型数据库中存储树形结构的关键。

        理想中树形结构应该具备如下特征:数据存储冗余度小、直观性强;检索遍历过程简单高效;节点增删改查CRUD操作高效。无意中在网上搜索到一种很巧妙的设计,原文是英文,看过后感觉有点意思,于是便整理了一下。本文将介绍两种树形结构的Schema设计方案:一种是直观而简单的设计思路,另一种是基于左右值编码的改进方案。

    一、基本数据

        本文列举了一个食品族谱的例子进行讲解,通过类别、颜色和品种组织食品,树形结构图如下:

    二、继承关系驱动的Schema设计

        对树形结构最直观的分析莫过于节点之间的继承关系上,通过显示地描述某一节点的父节点,从而能够建立二维的关系表,则这种方案的Tree表结构通常设计为:{Node_id,Parent_id},上述数据可以描述为如下图所示:


        这种方案的优点很明显:设计和实现自然而然,非常直观和方便。缺点当然也是非常的突出:由于直接地记录了节点之间的继承关系,因此对Tree的任何CRUD操作都将是低效的,这主要归根于频繁的“递归”操作,递归过程不断地访问数据库,每次数据库IO都会有时间开销。当然,这种方案并非没有用武之地,在Tree规模相对较小的情况下,我们可以借助于缓存机制来做优化,将Tree的信息载入内存进行处理,避免直接对数据库IO操作的性能开销。

    三、基于左右值编码的Schema设计

        在基于数据库的一般应用中,查询的需求总要大于删除和修改。为了避免对于树形结构查询时的“递归”过程,基于Tree的前序遍历设计一种全新的无递归查询、无限分组的左右值编码方案,来保存该树的数据。


        第一次看见这种表结构,相信大部分人都不清楚左值(Lft)和右值(Rgt)是如何计算出来的,而且这种表设计似乎并没有保存父子节点的继承关系。但当你用手指指着表中的数字从1数到18,你应该会发现点什么吧。对,你手指移动的顺序就是对这棵树进行前序遍历的顺序,如下图所示。当我们从根节点Food左侧开始,标记为1,并沿前序遍历的方向,依次在遍历的路径上标注数字,最后我们回到了根节点Food,并在右边写上了18。

        第一次看见这种表结构,相信大部分人都不清楚左值(Lft)和右值(Rgt)是如何计算出来的,而且这种表设计似乎并没有保存父子节点的继承关系。但当你用手指指着表中的数字从1数到18,你应该会发现点什么吧。对,你手指移动的顺序就是对这棵树进行前序遍历的顺序,如下图所示。当我们从根节点Food左侧开始,标记为1,并沿前序遍历的方向,依次在遍历的路径上标注数字,最后我们回到了根节点Food,并在右边写上了18。

        依据此设计,我们可以推断出所有左值大于2,并且右值小于11的节点都是Fruit的后续节点,整棵树的结构通过左值和右值存储了下来。然而,这还不够,我们的目的是能够对树进行CRUD操作,即需要构造出与之配套的相关算法。

     四、树形结构CRUD算法

    (1)获取某节点的子孙节点

        只需要一条SQL语句,即可返回该节点子孙节点的前序遍历列表,以Fruit为例:SELECT* FROM Tree WHERE Lft BETWEEN 2 AND 11 ORDER BY Lft ASC。查询结果如下所示:

        那么某个节点到底有多少的子孙节点呢?通过该节点的左、右值我们可以将其子孙节点圈进来,则子孙总数 = (右值 – 左值– 1) / 2,以Fruit为例,其子孙总数为:(11 –2 – 1) / 2 = 4。同时,为了更为直观地展现树形结构,我们需要知道节点在树中所处的层次,通过左、右值的SQL查询即可实现,以Fruit为例:SELECTCOUNT(*) FROM Tree WHERE Lft <= 2 AND Rgt >=11。为了方便描述,我们可以为Tree建立一个视图,添加一个层次数列,该列数值可以写一个自定义函数来计算,函数定义如下:

    [sql] view plain copy
    1. CREATE FUNCTION dbo.CountLayer  
    2. (  
    3.     @node_id int  
    4. )  
    5. RETURNS int  
    6. AS  
    7. begin  
    8.     declare @result int  
    9.     set @result = 0  
    10.     declare @lft int  
    11.     declare @rgt int  
    12.     if exists(select Node_id from Tree where Node_id = @node_id)  
    13.     begin  
    14.         select @lft = Lft, @rgt = Rgt from Tree where node_id = @node_id  
    15.         select @result = count(*) from Tree where Lft <= @lft and Rgt >= @rgt  
    16.     end  
    17.     return @result  
    18. end  
    19. GO  

        基于层次计算函数,我们创建一个视图,添加了新的记录节点层次的数列:

    [sql] view plain copy
    1. CREATE VIEW dbo.TreeView  
    2. AS  
    3. SELECT Node_id, Name, Lft, Rgt, dbo.CountLayer(Node_id) AS Layer FROM dbo.Tree ORDER BY Lft  
    4. GO  

        创建存储过程,用于计算给定节点的所有子孙节点及相应的层次:

    [sql] view plain copy
    1. CREATE PROCEDURE [dbo].[GetChildrenNodeList]  
    2. (  
    3.     @node_id int  
    4. )  
    5. AS  
    6. declare @lft int  
    7. declare @rgt int  
    8. if exists(select Node_id from Tree where node_id = @node_id)  
    9.     begin  
    10.         select @lft = Lft, @rgt = Rgt from Tree where Node_id = @node_id  
    11.         select * from TreeView where Lft between @lft and @rgt order by Lft ASC  
    12.     end  
    13. GO  

        现在,我们使用上面的存储过程来计算节点Fruit所有子孙节点及对应层次,查询结果如下:


        从上面的实现中,我们可以看出采用左右值编码的设计方案,在进行树的查询遍历时,只需要进行2次数据库查询,消除了递归,再加上查询条件都是数字的比较,查询的效率是极高的,随着树规模的不断扩大,基于左右值编码的设计方案将比传统的递归方案查询效率提高更多。当然,前面我们只给出了一个简单的获取节点子孙的算法,真正地使用这棵树我们需要实现插入、删除同层平移节点等功能。

     (2)获取某节点的族谱路径

        假定我们要获得某节点的族谱路径,则根据左、右值分析只需要一条SQL语句即可完成,以Fruit为例:SELECT* FROM Tree WHERE Lft < 2 AND Rgt > 11 ORDER BY Lft ASC ,相对完整的存储过程:

    [sql] view plain copy
    1. CREATE PROCEDURE [dbo].[GetParentNodePath]  
    2. (  
    3.     @node_id int  
    4. )  
    5. AS  
    6. declare @lft int  
    7. declare @rgt int  
    8. if exists(select Node_id from Tree where Node_id = @node_id)  
    9.     begin  
    10.         select @lft = Lft, @rgt = Rgt from Tree where Node_id = @node_id  
    11.         select * from TreeView where Lft < @lft and Rgt > @rgt order by Lft ASC  
    12.     end  
    13. GO  

    (3)为某节点添加子孙节点

        假定我们要在节点“Red”下添加一个新的子节点“Apple”,该树将变成如下图所示,其中红色节点为新增节点。


        仔细观察图中节点左右值变化,相信大家都应该能够推断出如何写SQL脚本了吧。我们可以给出相对完整的插入子节点的存储过程:

    [sql] view plain copy
    1. CREATE PROCEDURE [dbo].[AddSubNode]  
    2. (  
    3.     @node_id int,  
    4.     @node_name varchar(50)  
    5. )  
    6. AS  
    7. declare @rgt int  
    8. if exists(select Node_id from Tree where Node_id = @node_id)  
    9.     begin  
    10.         SET XACT_ABORT ON  
    11.         BEGIN TRANSCTION  
    12.         select @rgt = Rgt from Tree where Node_id = @node_id  
    13.         update Tree set Rgt = Rgt + 2 where Rgt >= @rgt  
    14.         update Tree set Lft = Lft + 2 where Lft >= @rgt  
    15.         insert into Tree(Name, Lft, Rgt) values(@node_name, @rgt, @rgt + 1)  
    16.         COMMIT TRANSACTION  
    17.         SET XACT_ABORT OFF  
    18.     end  
    19. GO  

    (4)删除某节点

        如果我们想要删除某个节点,会同时删除该节点的所有子孙节点,而这些被删除的节点的个数为:(被删除节点的右值 – 被删除节点的左值+ 1) / 2,而剩下的节点左、右值在大于被删除节点左、右值的情况下会进行调整。来看看树会发生什么变化,以Beef为例,删除效果如下图所示。

        则我们可以构造出相应的存储过程:

    [sql] view plain copy
    1. CREATE PROCEDURE [dbo].[DelNode]  
    2. (  
    3.     @node_id int  
    4. )  
    5. AS  
    6. declare @lft int  
    7. declare @rgt int  
    8. if exists(select Node_id from Tree where Node_id = @node_id)  
    9.     begin  
    10.         SET XACT_ABORT ON  
    11.         BEGIN TRANSCTION  
    12.             select @lft = Lft, @rgt = Rgt from Tree where Node_id = @node_id  
    13.             delete from Tree where Lft >= @lft and Rgt <= @rgt  
    14.             update Tree set Lft = Lft – (@rgt - @lft + 1) where Lft > @lft  
    15.             update Tree set Rgt = Rgt – (@rgt - @lft + 1) where Rgt > @rgt  
    16.             COMMIT TRANSACTION  
    17.         SET XACT_ABORT OFF  
    18.     end  
    19. GO  

    五、总结

        我们可以对这种通过左右值编码实现无限分组的树形结构Schema设计方案做一个总结:

        (1)优点:在消除了递归操作的前提下实现了无限分组,而且查询条件是基于整形数字的比较,效率很高。

        (2)缺点:节点的添加、删除及修改代价较大,将会涉及到表中多方面数据的改动。

        当然,本文只给出了几种比较常见的CRUD算法的实现,我们同样可以自己添加诸如同层节点平移、节点下移、节点上移等操作。有兴趣的朋友可以自己动手编码实现一下,这里不在列举了。值得注意的是,实现这些算法可能会比较麻烦,会涉及到很多条update语句的顺序执行,如果顺序调度考虑不周详,出现Bug的话将会对整个树形结构表产生惊人的破坏。因此,在对树形结构进行大规模修改的时候,可以采用临时表做中介,以降低代码的复杂度,同时,强烈推荐在做修改之前对表进行完整备份,以备不时之需。在以查询为主的绝大多数基于数据库的应用系统中,该方案相比传统的由父子继承关系构建的数据库Schema更为适用。

    参考文献:《Storing Hierarchical Data in a Database Article》

    展开全文
  • 数据库中存储层次数据 2009年07月24日 星期五 下午 1:27...[2]数据库,否则关系数据库中的表都不是层次结构,他们只是一个平坦列表。所以你必须找到一种把层次数据库转化方法。 存储树形结构是一个很常见
  • 关系数据库与非关系数据库的区别

    千次阅读 2020-08-20 21:11:39
    当前主流 关系数据库有Oracle、DB2、Microsoft SQL Server、Microsoft...2)查询速度:NoSql数据库将数据存储于缓存之关系数据库将数据存储在硬盘,自然查询速度远不及NoSql数据库。 3)存储数据格式:N
  •  传统的关系型数据库,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存储法(Row-based),在基于行式存储的数据库中, 数据是按照行数据为基础逻辑存储单元进行存储的, 一行中的数据在存储介质中以连续存储形式...
  • 数据库中存储层次树状数据

    千次阅读 2013-05-03 10:18:18
    无论你要构建自己论坛,在你网站上发布消息还是书写自己CMS程序,你都会遇到要在数据库中存储层次数据情况。同时,除非你使用一种像XML数据库,否则关系数据库中的表都不是层次结构,他们只是一个平坦...
  • 关系数据库之所以有这种优势,原因是什么?我知道关系数据库使用了关系模型,可是关系模型为什么就会有这种优势?还是说是数据库管理系统让人从实际存储结构解放出来?
  • 传统的关系型数据库,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存储法(Row-based),在基于行式存储的数据库中, 数据是按照行数据为基础逻辑存储单元进行存储的, 一行中的数据在存储介质中以连续存储形式存在...
  • 关系数据库中的概念

    2017-09-23 22:03:14
    视图与表的关系? table是事先定义好,view是呈现给用户。若想呈现方式与table设计不一样,又不想重新建table,则create view as......。view创建自table或view。table改变,相关view随之改变。 二、...
  • 数据库根据其数据的存储方式可以分为关系数据库和非关系数据库。常见的关系数据库有Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。常见关系数据库有 NoSql、Cloudant,Hbase等 3....
  • 数据库关系存储和分布式存储区别:应用目标不同、 实现方式不同、各结点地位不同。 (1) 应用目标不同。并行数据库系统目标是充分发挥并行计算机优势,利用系统中的各个处理机结点并行完成数据库任务...
  • 关系型数据库设计是是建立在关系模型基础上数据库,借助于集合代数等数学概念和方法来处理数据库中数据。...标准数据查询语言SQL就是一种基于关系数据库语言,这种语言执行对关系数据库中数据检索和操作。 关系
  • 数据库中的关系模型

    2020-05-26 15:45:04
    关系数据库是建立在关系模型上。而关系模型本质上就是若干个存储数据二维表,可以把它们看作很多Excel表。 核心概念: 表每一行称为记录(Record),记录是一个逻辑意义上数据。 表每一列称为字段...
  • 传统的关系型数据库,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存储法(Row-based),在基于行式存储的数据库中, 数据是按照行数据为基础逻辑存储单元进行...
  • 数据库设计范式是数据库设计所需要满足规范,满足这些规范数据库是简洁、结构明晰,...目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4N
  • 空间数据库中数据存储经历的三个阶段是:拓扑关系数据存储模式、Oracle Spatial 模式和ArcSDE 模式。拓扑关系数据存储模式将空间数据存在文件中,而将属性数据存在数据库系统中,二者以一个关键字相连。这样分离存储的...
  • 数据库中存储层次数据实现无限级分层无论你要构建自己论坛,在你网站上发布消息还是书写自己cms程序,你都会遇到要在数据库中存储层次数据情况。同时,除非你使用一种像XML数据库,否则关系数据库中的表...
  • 文章目录一、关系型数据库1.1 关系数据库中核心元素1.2 常用的关系型数据库二、非关系型数据库2.1 常见关系型数据库 一、关系型数据库 采用了关系模型来组织数据数据库,简单来说,关系模型指就是二维表格...
  • SQLite数据库是一个轻量级、嵌入式的关系数据库,可以方便使用SQL语句实现数据增加、修改、删除、查询、事务控制等操作。 Android系统,要进行SQLite数据库的操作使用如下所示类和接口: 1.android....
  • 【单选题】系统有权利启动和关闭数据库的用户是( )【简答题】1、道路交通安全法效力范围是如何规定?【简答题】5、机动车上道路行驶应当悬挂和携带哪些标志和牌证?【简答题】简述马斯洛需要层次论并阐明各...
  • 非关系型数据库如:redis ...而关系数据库存储在磁盘。因此,redisd读写效率更高,redis也可以把数据持久化到磁盘。 3、事务支持: 关系型数据库支持事务,而redis不支持。 4、是否能用sql语句: ...
  • 应用数学方法来处理数据库中的数据。 现实世界中各种实体以及实体之间 各种联系均用关系模型来表示。 由于关系数据库的广泛使用, 人们习惯把关系 数据库简称为数据库, 但是数据库绝不仅仅是关系数据
  • 数据库中就是一张张有着千丝万缕关系的表,所以表设计好坏,将直接影响着整个数据库。而在设计表时候,我们都会关注一个问题,使用什么存储引擎。等一下,存储引擎?什么是存储引擎? 什么是存储引擎? ...
  • 关系数据库 Is SaaS最佳存储介质  SaaS以租赁方式向用户提供软件服务。小型企业在资金和信息化人才缺乏情况下,可通过向SaaS购买帐号,可以迅速实现信息化,节约成本。SaaS虽然在国内普及度不够高,但...
  • MySQL 的存储引擎可能是所有关系数据库产品最具有特色了,不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间使用插件方式这种非常松耦合关系。 由于各存储引擎功能特性差异较大,这篇文章主要是...
  • 因此,通过将各种元素映射到表,你可以在关系数据库中存储XML。这个映射过程被称为XML到SQL映射技术。 Oracle发明了XML SQL(XSU)Java API来将XML转换成SQL,或者反过来映射。在你可以执行这种映射之前,你必须先...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,118
精华内容 7,247
关键字:

关系数据库中存储的是