本文将和大家探讨用纵向和横向这两种方法来组织Oracle数据库中的数据。本文的例子都是在Oracle数据库中完成的,但也适用于其他任何关系数据库。这些关系数据库数据组织的方法有利也有弊,文本也将为大家分析它们的异同。<域P>

根据业务和发展的需求,可以实施多种不同的数据 存储方式。第一种数据布局为横向结构。这是一种传统的数据 存储方式。顾名思义,每条新的数据记录都作为一行输入到表中,表字段是横向排列的。第二种是纵向结构。这是一种特殊的数据存储方式,只有由键(Key)和值(value)组成的两个实际数据列,以及一个(也可以是多个)识别列(ID)。
纵向vs.横向
下面的例子是传统的横向表结构:
表HR 
ID
部门
性别
123 技术部
234 市场部
456 会计部
而下面这个是纵向表结构的例子,存储的数据和上面的横向表相同:
表 VR
ID
Key
Value
123
234
456
123
234
456
123 部门 技术部
234 部门 市场部
456 部门 会计部
123 性别
234 性别
456 性别x
我们可以看到,数据从一个3行×4数据列的矩阵(表HR)转变成了一个12行×2数据列的矩阵(表VR)。横向表的记录条数与列数的乘积似乎和纵向表的行数相等。例如:3×4=12。不过,这种假设并不一定是正确的,稍后会在文中讨论这个问题。
纵向数据存储的利与弊

传统横向方式存储数据可以带有预先设定的结构和列,所以有很多优点,但也有缺点。假设我们设计的应用程序带有一个窗体显示区,而这个显示区是完全动态化的,且没有固定的字段号码或名称。用户可以即时创建一个新的字段,并赋予该字段名称和值。要怎样才能在数据库中长期存储这样的窗体呢?
又假设我们需要根据业务要求来创建一些窗体,各个窗体具有一些符合特定业务需求的不同的字段。我们要把各个窗体的数据都存储在一个横向结构表中,该表中给每一个字段分配一个特定的列,而每个窗体就是该横向表的一行。经过一段时间以后,由于业务需求需要对某个窗体添加一个新的字段。为了将新字段添加到窗体中,就必须改变用户界面和持久层逻辑,而且实际存储的表还需要为此添加额外的列,这样该应用程序还需要重新进行测试和调配。在一个开发人员没有权限直接访问数据库的环境中,数据库管理员团队也要参与到表的实际修改操作当中。如果只需要修改一次也就罢了,但是如果过一段时间后又需要添加另外一个字段呢?
要解决上面提到的两种情况,就需要使用纵向数据存储方式,并在应用层和用户界面上采用一种不同的动态逻辑。因为数据能够以“键/值”配对的形式存储在只有两列的表中,并通过单一的ID的形式将数据通通绑定在一个逻辑窗体中,而且对于能够在一个窗体中设置多少字段并没有限制。而后,纵向表中的每个逻辑行的字段数就可以不一样了。由此可见,纵向数据存储结构的最大好处就是灵活性,不过也有很多弊端。
首先,虽然弹性是有了,但失去了对数据的控制权,也就是说很难维持数据的规范化。举个例子,如果我们在一个纵向表中存储了一个共同基金的信息,根据分析师的名字和联系方式都能够对这些信息做出修改;而通常情况下,这种类型的信息都是存储在不同的表种,并通过外键ID连接到基金表的。而且,在纵向表中,字段的数据类型设置也会出现问题。因为在“值”这一列,只能设置成一种数据类型(例如,设置成varchar),而所有的值都必须是这种类型的值,或者你也可以在保存和检索操作中不停来回转换数据类型。此外,在纵向表中不可能存储类似于BLOB和CLOB这种特殊类型的数据。
纵向表还有一个缺点就是数据的一致性问题。将所有的列名都输入到一个“键”列中,使用户(或应用程序)能够很轻易就把相同的数据存储成不同的“键”和“值”。例如,用户可以创建一个新字段,命名为“公司”,赋予其值为“甲骨文”;而其他用户可能将字段名改为“企业”,而值为“甲骨文”,事实上两个用户的数据是相同的。
此外,要管理和操作纵向表很有难度。要找到并确定一个逻辑行,需要进行多次自连接操作。因此,很少有商业报表软件能够利用纵向表来生成任何有意义的报表。

例如,以上面的表为例,要从横向表中获取所有男性雇员的记录,我们可以使用以下的select语句:
Select * from HR where 性别 like '男'
而要从纵向表中获取同样的数据,我们就需要进行自连接查询,先获取ID,然后获取数据:
Select * from VR where id in 
  (Select id from VR 
  where key = '性别' 
  and value = '男')
很多开发人员会编写一些特别的函数或存储过程将纵向结构表转换为横向结构,只有这样做,他们才能做出报表,并能够更容易地使用这些数据。
纵向表分组
纵向数据存储的变体能够引入自定义算法把逻辑数据行聚类。这意味着可以使用两个或以上ID列来作为分组属性。例如: 
ID
分组
KEY
VALUE
123 1 姓名 李丽
123 1 电话 22221111
123 2 机器 HP 520
123 2 供应商 Verizon
234 1 姓名 马军
234 1 电话 33334444
234 1 电子邮件 m@mail.com
243 2 机器 IBM T61
当生成自定义报表时,可以很容易地根据第二个“分组”列来将不同的内容分割到不同的页或不同的区域内。因此,上面的纵向表可以得到以下报表:
Report 1  
  Page 1  
姓名 电话  
李丽 22221111  
Page 2  
机器: HP 520
供应商: Verizon
Report 2  
  Page 1  
姓名 电话 电子邮件
马军 33334444 m@mail.com
Page 2  
机器: IBM T61
总结
本文为大家介绍了在 数据库表存储数据的两种不同方式。虽然纵向数据布局的缺点往往会把它的优点覆盖掉,但某些情况下为了获得灵活性,这种纵向结构是设计数据组织结构的唯一出路。另一方面,横向表则是管理数据库管理系统中存储数据的传统模式,更易于实现数据规范化。对于软件和数据库 架构师而言,要选择何种设计方式来长久保存数据取决于特定的应用需求。

Oracle的表结构:纵向和横向相关推荐

  1. MySql 、Oracle 获取表结构和字段信息

    MySql获取表结构信息 SELECTTABLE_NAME,TABLE_COMMENT FROMinformation_schema.`TABLES` WHERETABLE_SCHEMA = 'dm' ...

  2. oracle复制一个表的结构图,Oracle复制表结构

    Oracle复制表结构 如下,表a是数据库中已经存在的表,b是准备根据表a进行复制创建的表: 1.只复制表结构的sql create table b as select * from a where ...

  3. 数据库oracle修改属性列,Oracle修改表结构

    本篇文章帮大家学习Oracle修改表结构,包含了Oracle修改表结构使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 在本教程中,我们将学习如何使用Oracle ALTE ...

  4. oracle 数据库表结构对比

    oracle 数据库表结构对比 由于公司工作比较混乱,总有人会改数据库中表的内容和字段. 在部署的时候总会因为数据库出现了未知的改变而发生错误. 所以需要对数据库内容进行比对,以求得到变化的内容. 导 ...

  5. oracle用命令查表结构,Oracle查看表结构命令详解

    获取表: select table_name from user_tables; //当前用户的表 select table_name from all_tables; //所有用户的表 select ...

  6. 查询oracle表结构及注释,oracle查看表结构和注释

    查看表结构: 看字段名与数据类型 select   *   from   cols     WHERE   TABLE_name=upper( 'table_name ') 查看主键: select ...

  7. oracle怎么看一个表结构,Oracle查看表结构的几种方法

    Oracle查看表结构的几种方法 1,DESCRIBE 命令 使用方法如下: SQLgt; describe nchar_tst(nchar_tst为表名) 显示的结果如下: Oracle查看表结构的 ...

  8. oracle 查看表结构

    oracle 查看表结构 1.命令窗口:desc 表名 2.sql窗口:select * from user_tab_columns where table_name='大写表名':

  9. oracle修改表结构的sql命令是什么,sql语句中修改表结构的命令是什么?

    sql语句中修改表结构的命令是:"ALTER TABLE"命令. ALTER TABLE 语句用于在已有的表中添加.删除或修改列. SQL ALTER TABLE 语法 如需在表中 ...

最新文章

  1. [原创] Neo.Geo 视频帧浏览器开发日志
  2. java浏览器实验报告_关于java实验报告模板
  3. java实现微信创建菜单_java实现微信公众平台自定义菜单的创建示例
  4. 中山市区电信5g覆盖地图_热点 | 百度与中国电信达成战略合作 覆盖5G、互联网等领域...
  5. 马云在《赢在中国》对创业者的经典点评
  6. PyCharm 设置运行参数
  7. 谷歌宣布Kotlin成安卓开发一级语言,我们如何来学习它
  8. 阶段3 2.Spring_07.银行转账案例_7 代理的分析
  9. 漏洞分析阶段 PTES
  10. python调用nmap_Python调用nmap扫描网段主机信息生成xml
  11. Freescale PowerPC系列架构 处理器 种类介绍 型号发展
  12. 【源码分享】-c++界面源代码分享
  13. 论文绘图——矢量图篇
  14. excel页码怎么设置从4开始?
  15. 集成墙面拆后恐怖极了,没想到这么美!
  16. 基于C语言实现http下载器
  17. 二级计算机等级证水平高吗,全国计算机水平一级高还是二级高
  18. 一文读懂5G智慧教育:42个应用场景如何改变教育
  19. uniApp使用GoogleMap规划多个目的地路线
  20. 【Linux从青铜到王者】第二十三篇:Linux网络基础第四篇之kcp协议

热门文章

  1. IPFS计算机存储器,IPFS节点储存
  2. function name should be lowercase
  3. BZOJ4920: [Lydsy1706月赛]薄饼切割
  4. 其他算法和思想的题目
  5. 直击平昌! 2天40位大咖的平昌区块链论坛精华都在这了!
  6. MySQL查询总积分前十的用户信息和总分
  7. 计算机硬件技术基础课程主要内容,计算机硬件技术基础课程设计.doc
  8. 肉鸡进程linux,教菜鸟如何获得大量Linux肉鸡网站安全 -电脑资料
  9. 机器学习强基计划3-4:详解核方法——以核支持向量机KSVM为例
  10. 数据库的连接 (十)