您觉得SQL存在哪些不足之处?您会对它做出哪些改变?

时间:2010-06-19 19:07:46

标签: sql c database database-design nosql

使用SQL时是否遇到过缺陷,限制或缺陷?

使用其他非SQL语言轻松完成的任务非常复杂或无法使用SQL!

Here's a good example

您能否向我提供您遇到的问题的案例或例如SQL查询需要复杂结构的情况?人们陷入的陷阱认为所需的解决方案必须适合单个SQL语句。

您能否提出改进措施,使SQL更强大,更简单?示例:PSM

您认为哪种SQL实现最强大?

您希望在SQL中实现哪些非SQL环境功能?

假设SQL不存在,你会用什么操作数据?

6 个答案:

答案 0 :(得分:19)

SQL通常作为数据库语言存在一些严重的缺陷。只有一些问题是:

  • 重复行(多组而不是基于组的模型)

  • Nulls和三个值逻辑会增加复杂性,模糊性和不一致的结果,而不会给语言增添任何表达能力

  • SELECT语句语法比关系代数更冗长,更复杂

  • 缺乏对多重分配的支持意味着参考完整性支持和对约束的支持受到严重限制

SQL中难以解决的更具体查询问题的两个示例:

  • SQL中的传递闭包没有简单的等价物。因此,从邻接关系结构中进行选择需要使用过程代码,游标或非直观且难以优化的递归查询语法。

  • 缺少密钥继承意味着SQL查询接口总是返回简单的二维表,这是本质上是n维的查询决策支持(OLAP)类型的主要缺点。

改进?我不相信有任何有用的改进是有意义的,因为修复上述内容会彻底改变语言,甚至假装它不再是SQL就没有多大意义。我相信最好的方法是开发全新的,真正的关系语言。 Date和Darwen的D模型是SQL最明显的继承者,已经导致了许多关系语言的新实现。

答案 1 :(得分:5)

为了增加@dportas的优秀答案,对我来说,SQL中错失的机会是建议的时态扩展(称为TSQL2)从未进入SQL标准。因此,即使使用Full SQL-92,临时数据库也很难实现。例如,当有效状态表中的序列删除需要四个时,多重分配将是一个福音 语句(一个INSERT,两个UPDATE和一个DELETE)。当您考虑到大多数供应商缺乏对SQL-92功能的支持(例如,SQL Server缺少DEFERRABLE约束,Oracle缺少CHECK约束中的子查询等)如果没有“最差”,几乎不可能实现程序代码。

答案 2 :(得分:4)

从数据操作语言的角度来看,SQL有一些缺点:

  1. 没有标准的SQL方法来使用正则表达式。数据约束通常以正则表达式的形式表示,并且在SQL中使用标准的正则表达式语言非常有用。我知道SQLite允许你放入自己的正则表达式引擎,我确信其他数据库也可以这样做,但是标准的数据库会很好。
  2. SQL需要SQL中的命令式编程语言,语言结构包括变量和变量赋值,词法闭包和迭代器。
  3. SQL需要一种标准方式来表达可在查询中使用的用户定义函数。
  4. 我认为这将有助于它作为关系数据操作语言。对于其他类型的数据,SQL还不够好。

答案 3 :(得分:4)

梦幻般的答案,dportas: - )

虽然不是那么迷人,但我希望在SQL标准中使用的是“INSERT OR UPDATE”约束冲突解决算法。 MySQLSQLite将此实现为SQL标准的扩展

这个IMO应该是内在的数据库引擎功能,否则你会纠结于:

IF (record_exists) THEN
    -- update record
ELSE
    -- insert new record

这似乎微不足道,但它

  • 促进了复制/粘贴代码块等坏习惯,
  • 介绍了错误和
  • 只是浪费你的时间,很多次。
  • 它还增加了可维护性的负面因素。

两个查询可以轻松替换为一个:

"Insert OR Update Table (field = value) Where ID = @ID"

感觉更自然: - )

答案 4 :(得分:3)

  

使用时是否遇到过缺陷,限制或缺陷?   SQL?

许多人:http://c2.com/cgi/wiki?SqlFlaws

  

您是否可以使用不同的DML或者轻松完成相同的任务   编程语言?

我确信答案是肯定的。 The third manifesto描述了我们应该使用的内容而不是SQL:Tutorial D

  

您能否向我提供您遇到的问题的案例   或者例如SQL查询需要复杂结构的情况   与其他原因中的简单结构相比?

是:例如,在SQL中重命名列。假设我有一个包含此列的表:a,b,c,d,e,f,g,h,我现在,说我想将列a重命名为“X”。在SQL中我需要写:

SELECT a as X,b,c,d,e,f,g,h,i FROM SomeTable

在教程D中我只写:

SomeTable RENAME ( a AS x)

或者让我们反过来看看,这个Tutorial D查询的等价物是什么:

 SomeTable REMOVE (e)

嗯,很难找到丢失的“e”..不是吗?):

SELECT a,b,c,d,f,g,h,i FROM SomeTable

或者简单地告诉我,用什么代码更容易理解开发人员的意图:

SELECT a as X,c,d,e,f,g,h,i, g+h as z from SomeTable

或与此(它是相同的查询!):

SomeTable RENAME (a AS X) REMOVE (b) ADD (g+h z)

请参阅? SQL核心有缺陷!或者简单地尝试从存储过程调用中编写select *。根据数据库的不同,可能无法正常工作

  

您能否提出改进建议,使SQL更强大,更少   复杂?

很多,用教程D或Dataphor

之类的东西替换它
  

您认为哪种RDBMS / SQL产品实施最强大?

健壮的 PseudoRDBMS ? Oracle,DB2和SQLServer。强大的RDBMS?没有了。也许Dataphor或Rel将成为第一个...所有其他人都无权被称为“关系”

  

您希望从非SQL环境中看到哪些功能   在SQL中实现?

我的梦想是有一天会看到一个正确的关系实现...但是目前我很高兴如果任何数据库完全实现了SQL标准(没有)

  

假设SQL不存在,你会用什么操作   数据?..

我将阅读第三个宣言,并实施它。或者使用DataLogGenexus两者都给你Access Path Independence,Genexus甚至会给你Normalization By Synthesis,超出了SQL的范围。

或者,最近,ODATA queries(但遗憾的是,ODATA分享了SQL的一些弱点)

答案 5 :(得分:1)

就个人而言,我对CODASYL数据库情有独钟,您可以在其中访问数据集以访问相关数据元素......也许是因为我对数据库的第一次体验是DECs DBMS。找到父记录,然后简单地走一组孩子的能力很容易使用;并且在基础数据库结构中构建的数据集之间的显式关系在关系数据库中是令人遗憾的缺乏的......在任何人提出之前,外键是这种关系的苍白,一维的阴影。

SQL中内部/外部/直接连接的复杂性变得无关紧要,因为数据集的结构维护不同记录集(表)之间的关系,允许您仅访问相关的那些数据集记录。查找订单和行走OrderLine数据集将仅返回属于该订单的订单行,而无需制定第二个查询以从所有订单的整个订单行表中检索该系列行。

缺点是几乎所有的设计都需要预先完成...一旦设计了数据库结构,它几乎是固定的,很难改变....与RDBMS相比,它更容易添加新表在任何时候....不是特别适合RAD / Agile / XP / Scrum的世界。

现在,如果只有某人能够提出一个数据库系统,其结构像RDBMS一样灵活且易于更改,并且具有CODASYL数据库的所有数据访问的简单性。

OLAP数据库是RDBMS的另一个很好的替代方案,其中数据可以很容易地构建为n维立方体,其中查询允许您“切片并切块”多维数据集,快速提取数据段。我对OLAP的第一次介绍是Oracle Express,它(不幸的是)使用自己的专有查询语言而不是事实上的标准MDX。但是,并非所有数据都可以很容易地适应“立方体”结构,因此它仅适用于某些应用程序类型 - 尽管几乎所有数据挖掘应用程序都非常适合。