目录
介绍
实现
看起来如何?
安装和示例
反馈
介绍NoSqlOnSql基于扩展SQL数据库以支持NoSQL功能而无需任何内核更改。从这个意义上讲,它类似于诸如https://www.torodb.com或https://www.microsoft.com/zh-cn/research/project/json-server-2/等其他举措。
但是,NoSqlOnSql的方法不同,不是在处理流程中挂接中间件,而是在处理开始之前处理NoSQL语义。NoSqlOnSql被实现为源到源的编译器:NoSqlOnSql语句被编译为常规SQL语句,这些语句通常由数据库执行。该编译可以随时进行,即使在创建数据库之前查询的开发过程中也是如此。
NoSqlOnSql能够创建、更新和查询文档而无需任何架构定义。使用类似于JSON的符号定义文档。
实现供应商之间的SQL实现不兼容。除此之外,对标准的遵循程度也很不同。这意味着,不幸的是,NoSqlOnSql的每个实现都必须针对特定的SQL风格。NoSqlOnSql的当前实现针对Transact-SQL或T-SQL。这是Microsoft SQL Server中使用的语言。
此外,在当前实现中已考虑以下注意事项:
- 任何有效的SQL语句都是有效的NoSqlOnSql语句。SQL和NoSqlOnSql语句可以合并。NoSqlOnSql转换为等效的SQL语句。例如,可以从NoSqlOnSql SELECT查询创建SQL VIEWS。
- 实现应尽可能不打扰。由NoSqlOnSql创建的永久工件的数量减少到实现一个集合中所有文档的ONE层次表。
- 处理复杂查询时,NoSqlOnSql可能需要创建临时对象,查询完成后将丢弃这些临时对象。为避免名称冲突,所有NoSqlOnSql对象均以NOSQL_前缀开头。
- NoSqlOnSql遵循只写模式,永远不会删除或更新数据。
如果需要更改值,则会创建该值的新版本。结果如下:
- 默认情况下,仅提供值的最新版本,但是可以访问文档的更改历史记录。这使得NoSqlOnSql存储成为实现区块链的理想媒体。
- 这种方法也遵循事件存储范例:https : //en.wikipedia.org/wiki/Event_store
- 在SQL层,实现集合仅需要支持INSERT和SELECT。那就是表上的记录永远不会被修改或删除。在考虑容错(即复制)和可伸缩性(即分片)时,这提供了许多优势。
NoSqlOnSql语法与SQL相似,它遵循语句、数据集和数据集操作的相同范例。所有NoSqlOnSql语句均以nosql开头。
NoSqlOnSql完全集成在SQL中,这两种类型的语句及其结果都可以混合在一起。
由于一个例子胜过千言万语,下面的例子不言而喻。此刻,不要太在意语法,只关注一般感觉以及NoSqlOnSql与SQL的混合方式。
nosql create springfield override
nosql insert {
name: "Homer",
nationality:"US",
age: 34, color:"green",
lastname:"Simpson" ,
weight:90,
likes:['football','doughnuts'],
children: [
{name: "Bart",lastname:"Simpson",weight:38,age:10},
{name:"Lisa",lastname:"Simpson",age:8,likes:['music']}
]
} into springfield
nosql insert { name: "Moe",lastname:"Szyslak",occupation:"bartender"} into springfield
nosql select ?,$name,$lastname,#age,$children[0].name as kid0 from springfield _
where $Lastname='Simpson'
返回:
id | name | lastname | age | kid0
----------------------------------
0 1 | Homer | Simpson | 34 | Bart
1 4 | Bart | Simpson | 10 |
2 5 | Lisa | Simpson | 8 |
安装和示例
用于T-SQL的NoSqlOnSql可作为.NET Framework的NuGet包提供。
Install-Package nosqlonsql -Version 1.0.1
使用它很简单,只需创建一个NoSql对象。
var nosql = new NoSql();
使用nosql查询和支持的SQL方言类型调用Transpile(“mssql”表示MS SQL Server)。错误的结果表示语法错误:
if (!nosql.Transpile(nosqlquery, "mssql")) throw new Exception(nosql.Error);
代码、注释和主机回调是由于编译而生成的,但是我们只对Code块感兴趣,Code块只是常规的SQL代码。因此,我们照常执行它们:
using (var database=new SqlConnection(connectionString))
{
for (var i = 0; i < nosql.Code.Length; i++)
{
if (nosql.Code[i].Type == BlockType.Code)
{
using (SqlCommand command = new SqlCommand(nosql.Code[i].Value, database))
{
using (var rs = command.ExecuteReader())
...PROCESS AS USUAL !!
}
}
}
}
更详细的示例可在 https://github.com/jsegarra1971/nosqlonsql/tree/master/Demo中找到。
NoSqlOnSql尚未准备就绪。当前,这只是概念证明(PoC),可以证明基于SQL和NoSQL文档之间的差距不是技术上的差距,而是概念上的差距。因此,它可以完全包含现有功能以及一些思考。
PoC是有效且扎实的,但是将其转变为可操作产品所需的工作并不是我愿意独自承担的。