NoSQL或者Not Only SQL(不仅仅是SQL)是一种数据存储和检索方法,对于开发交互式Web应用的初创公司和处理大量数据的企业而言,这是非常“时髦”的方法。这种方法受欢迎的主要原因是:与传统关系型数据库管理系统(RDBMS)相比(包括甲骨文的MySQL和微软的SQL Server),它提供更好的可扩展性和可用性,以及更快的访问数据。
RDBMS中的数据需要是可预测的,因此数据可以存储在有结构的表和行中,通过不同元素之间定义关系。另一方面,NoSQL数据库中的数据则不需要如此结构化或者按照固定的模式。当性能和实时访问比一致性更重要时,例如当索引和检索大量记录时,NoSQL比关系型数据库更适合。在NoSQL中,数据也可以更容易地跨多个服务器存储,因而提供更好的容错性和可扩展性。谷歌和亚马逊等公司是使用自己的云友好型NoSQL数据库技术,现在有很多商业和开源NoSQL数据库可供企业选择,例如Couchbase、MongoDB、Cassandra和Riak。
尽管数据存储在NoSQL数据库中有诸多优点,但快速方便地访问数据的需要严重影响了NoSQL安全。为了安全地存储信息,数据库需要提供保密性、完整性和可用性(CIA)。企业RDBMS数据库通过集成的安全功能提供CIA功能,例如基于角色的安全、加密通信、支持行和列访问控制,以及通过预先设定的程序,用户级权限的访问控制。RDBMS数据库还具有ACID(原子性、一致、隔离、耐用)功能来保证数据库交易的可靠处理;数据复制和日志记录确保耐用和数据完整。由于这些功能增加了检索大量数据所花费的时间,所以它们没有部署在NoSQL数据库中。
为了保证对数据的快速访问,NoSQL数据库基本没有内置安全性。它们有BASE(基本可用、软态、最终一致)的属性;不需要每次传输后的一致性,该数据库只需要最终达到一致状态。例如,当用户查看数据时,比如存储条目的数量,用户会看到数据的最后一次快照,而不是当前视图。因为数据交易没有立即写入到数据库中,同时进行的交易可能会互相干扰。这种固有的争用情况(用户不一定在同一时间看到相同数据)意味着NoSQL数据库永远不会用于处理金融交易。
NoSQL数据库还缺乏保密性和安全性。由于NoSQL数据库没有固定的模式,对表、列或行的权限不能被隔离。这也可能导致相同数据出现多个副本。这会让该数据库很难保持数据的一致性,特别是对多个表格的更改不能包装到一个交易中,因为其插入、升级或删除操作的逻辑单元是作为整体来执行。
现在有超过20种不同的NoSQL部署,缺乏标准也让保持数据安全的更复杂。保密性和完整性必须完全由访问NoSQL数据的应用来提供。对于任何在应用级有价值的数据,只设置最后一道防线并不是正确的做法。应用开发人员并不擅长部署安全功能,新代码通常意味着新漏洞。发送到NoSQL数据库的任何请求都需要进行转义、过滤和验证,而数据库本身需要位于强壮的环境中。
有趣的是,一些NoSQL项目现在开始添加RDBMS类型的安全功能。例如,甲骨文对写入到一个节点的数据增加了事务性控制。Cassandra支持交易记录和自动复制,而MongoDB支持主从复制。
如果可扩展性和可用性是企业对数据库的主要要求,那么,NoSQL可能是某些大型数据集的最佳选择。然而,系统架构师在选择NoSQL数据库之前,应该仔细考虑他们对安全、隐私和数据完整性的需求。缺乏NoSQL安全功能,即身份验证或认证支持,意味着敏感数据最好保存在传统RDBMS中。