我最近阅读了很多文章,从两个方面描述了SQL和NoSQL,例如http://use-the-index-luke.com/blog/2013-04/whats-left-of-nosql.这些文章经常涉及ACID和可伸缩性等主题.但是,我通常在SQL中遇到的一些问题似乎很少在这些文章中提及,我想知道为什么,以及这是否与我不完全理解SQL有关.如果有人能够启发我,至少部分是通过以下一项或多项,我将非常感激.
我的SQL问题:
- SQL本质上是不安全的:SQL是一种用于插入的语言,没有任何方法来阻止代码而不是数据的插入.防止插入的唯一方法是使用它将SQL与应用程序完全隔离.为什么SQL本身还没有解决这个问题?
- SQL似乎是针对其中包含的数据可能的最小存储大小而制作的.虽然这仍然对大量数据有很大意义,但它不再适用于较小的数据库,或者它是什么?
- SQL强制所有内容都适合二维关系模型,特定关系表用于执行其他维度.对我来说,这有两个问题:
- 数据的一致性完全依赖于关系表
- 在失败的情况下,人类很难理解数据
- SQL没有维护历史记录,因为默认情况下它会进行破坏性更新:当然有各种方法来创建历史记录,但这需要使用额外的表格和使用时间戳来自定义编写的东西,或者为此创建新的记录每一次变化,都会导致表格规模呈指数级增长.
- SQL似乎更倾向于丢失数据丢失:如果发生错误或丢失一致性,将情境恢复到一致状态的唯一方法是使用备份,这意味着最新的更改将被销毁.这部分是因为缺乏历史(见4),而且由于缺乏人类可读性,没有真正的方法让人类尝试纠正错误.
- 特别是在Web环境中,SQL的使用通常意味着通常不止一次创建模型.在普通(简单)PHP Web应用程序中两次:一次在PHP中,一次在SQL中.在完整堆栈Web应用程序中三次:一次在客户端应用程序中,一次在中间件中,一次在SQL数据库中(如果没有使用ORM).由于编程语言不同,以及它们之间的类型差异,这意味着这些模型之间存在很多可能的冲突.我知道像ActiveRecord和Django这样的ORM解决了这些问题中的至少一部分,但是由于SQL表包含VARCHAR(25)并且没有使用任何语言(JavaScript,Ruby,PHP),您还需要做额外的工作量. ,Perl,Python等)知道那种构造,是巨大的.
- 数据结构更改似乎被视为一致性问题:如果数据结构中的某些内容发生更改,表更改将应用于该表中的每个现有记录,即使记录最初没有该字段且是否有意义该记录有该字段.一组这些更改会导致自动迁移,这会增加另一层可能出现的问题,尤其是在一致性方面.
- 混合存储逻辑和应用程序逻辑:SQL似乎急于将应用程序逻辑的一部分吞噬为存储过程(CouchDB也通过视图执行此操作).虽然我知道对于某些类型的操作,您需要服务器端和非常严格控制的过程,但我不明白为什么它们存储在数据库中并作为存储引擎的一部分,而不是作为应用程序的一部分(中间件).
我知道(但不是很熟悉)像PostgreSQL Hstore这样的东西,但是我并没有完全看到它如何解决上面提到的问题.感谢您的任何见解!