关系数据库模型支持了sql语言的发展,并且拥有强大的理论基础为后盾(基于一阶的谓词逻辑),目前,sql已经成为定义和操纵关系数据库的标准语言。
关系数据模型的另一个好处在于它的简单性、适合联机事务处理(oltp)、支持数据独立性。但是关系数据模型特别是rdbms同样存在许多的不足之处。详细内容请参考下文:
一.对“现实世界”实体的表达能力比较弱
规范化通常导致表与“现实世界”中的实体不对应,它将“现实世界”中的实体分割成几张表来显示,以物理表示法来反映实体结构,这样效率会比较差,常常要在查询处理中进行很多连接操作。
二.语义过载
关系模型表达数据和数据间关系的构造只有一种——表。例如,为了表达实体a和实体b之间的多对多(*:*)关系、我们需要创建三张表,两个分别用于表达实体a和b,第三张表用于表达实体间的关系。它没有一种机制来区分实体和关系,也无法区分在实体间存在的不同种类的关系。例如,一个1:*关系可能是has、supervises、manages等等。如果可以进行区分,也许我们就可以将语义构建到操作中。所以,我们说关系模型语义过载了。
三.不能很好的支持业务规则
很多商业化系统不能完全支持实体和参照完整性、域等业务规则,所以需要将它们内置到应用程序中。这样当然是危险的,而且容易导致做重复的工作。更糟糕的是,可能还会引起不一致现象。而且,在关系模型中不支持其他类型的业务规则,这又意味着它们需要被构建到dbms或应用程序中。
四.有限的操作
关系模型只有一些固定的操作集,例如面向集合和记录的操作,操作是在sql规格说明中提供的。但是,sql目前不允许指定新的操作。因此,在给许多“现实世界”对象的行为建模就有了太多的限制。例如,一个gis应用程序典型的使用点、线、线组、多边形和一些处理距离、交叉点和包含关系的操作。
五.处理递归查询困难
数据的原子性意味着在关系模型中不允许出现重复的数据组,这样就导致了处理递归查询极为困难。递归查询就是那些有关表和自身直接或间接的关系的查询。为了解决这个问题,sql可以嵌入在一个高级程序设计语言中,由高级程序设计语言来提供支持反复操作的功能。而且,很多rdbms提供了具有类似结构的报表书写程序。不管是哪种情况,都是应用程序而不是系统的内在功能提供了所需的功能。
六.阻抗失配
直到最新版本的sql标准,都缺少完全的计算功能。为了解决这个问题并且提供更多的灵活性,sql标准提供嵌入式sql来帮助开发更加复杂的数据库应用程序。但是,这引起了阻抗不匹配(impedance mismatch)的问题,因为我们将两种不同的程序设计模式混合在了一起。
1.sql是一种处理行数据的声明性语言,而诸如c语言这样的高级语言则是过程化的语言,一次只能处理一行数据。
2.sql和3gl使用不同的模型来表达数据。比如,sql提供内置的数据类型date(日期型)和interval(时间间隔型),而在传统的编程语言中却没有这样的类型。因此,就需要应用程序在两种表示法之间进行转换。而这样做无论从程序设计的工作量还是运行时资源的使用来看都是低效的。而且,由于我们使用两种不同的系统,因此,不可能将类型检测作为一个整体自动进行。
注:sql标准(sql3)通过引入许多新的特征已经弥补了上文中讲述的一些不足之处。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
Azure数据湖分析从U-SQL中获得提升
大数据的发展已经让许多精通SQL的数据专业人员不知所措。微软的U-SQL编程语言试图让这些人回归数据查询游戏。
-
TT百科:SQL(结构化查询语言)
一般来说,SQL-on-Hadoop仍是一项新兴技术,但随着各个公司寻求获得拥有大数据应用程序编程SQL技能的开发和分析人员,它们正逐渐成为Hadoop部署的固定组件。
-
SQL和NoSQL数据库设计之争
企业收集了很多大规模增长的松散结构化数据,Hadoop,Spark以及其他新技术处理这些数据非常有助于改善商业智能分析效率。
-
如何通过格式良好的SQL提高效率和准确性
格式良好的SQL并不会比乱七八糟的SQL运行效果更好。数据库其实不怎么关心SQL语句中你把逗号放到了字段名的前面还是后面。