使用Azure Cosmos免费创建高分数据库(2):API、数据模型和Azure表格
首先
我之前以为Azure Cosmos DB只是一个普通的NoSQL数据库,所以在之前的文章中开始免费创建了一个高性能数据库。但是看起来似乎不能实现我所期望的功能,除非使用Table API。所以我决定去调查一下Table API。
总结一下,由于Table API没有排序功能,所以无法将其用作高分数据库。
API和数据模型
在Azure Cosmos DB中,您可以在创建数据库账户时选择API和数据模型类型。
MongoDB和Cassandra都是NoSQL数据库。如果原本就在使用,可以在相同的接口(API)下使用它们,并且迁移相对容易。由于本次没有使用过这两个数据库,所以详细信息省略。
Gremlin是一个图数据库。针对本次需求,它的意识过高,所以详细信息省略。
如果你从Azure Portal的控制台上查看由核心(SQL)创建的数据库,你会看到原始的JSON数据并且会产生一种“有些不对劲”的感觉,之后你可能会将其转换为Azure表,但这个决定并不重要,事后反而会后悔不已。
蔚蓝色的表格
具有 PartitionKey 和 RowKey 的键值存储。
当在 Azure 门户控制台中进行确认时,显示了一个带有每个项目标题的表格,给我一种“这就是我熟悉的数据库”的安心感。此外,由于 API 简单且学习成本较低,所以我继续进行工作。
※数据浏览器(AZURE TABLE API):一个看起来像常见数据库的东西,在屏幕上给人一种安心感。
在进行创建、插入和更新的工作顺利进行时,意识到在读取时无法进行排序操作。因此,在本项目中决定不使用Azure表,但考虑到已经调查了这个问题,决定将其记录下来。
const storage = require('azure-storage')
const client = storage.createTableService('接続文字列')
const eg = storage.TableUtilities.entityGenerator
//
//
// テーブル作成(テーブルのスキーマ定義は行わない)
//
//
client.createTableIfNotExists('<テーブル名>', (error, result) => {
// 処理が終了するとコールバックが呼ばれる。
})
//
//
// レコードの登録/更新。
//
//
// 登録時に型指定も行う。
const entry = {
PartitionKey: eg.String('<PartitionKeyの値>'),
RowKey: eg.String('<RowKeyの値>'),
no: eg.Int64(1) // 任意の項目
}
client.insertOrReplaceEntity('<テーブル名>', entry, (error, result) => {
// 処理が終了するとコールバックが呼ばれる。
})
//
//
// 任意のレコードを取得
//
//
client.retrieveEntity('<PartitionKeyの値>', '<RowKeyの値>', key, (error, result) => {
// result.entry に値が入っている
// 値は<項目名>._ に入っている
// console.log(result.entry.no._) // 1
})
//
//
// TableQuery を利用して、任意のPartition のレコードを取得
//
//
// 上位10件スコア取得、ではなく登録順に10件取得
const q = new storage.TableQuery().select('name', 'score').top(10)
client.queryEntities('scores', q, null, (error, result) => {
if(error) {
console.error(error)
} else {
const entries = result.entries
for(const e of entries) {
console.log(e.name._, e.score._)
}
}
})
截止到2020年10月10日,TableQuery提供的接口如下。
// コメント除去して抜粋
export interface TableQuery {
select(...args: string[]): TableQuery;
select(args: string[]): TableQuery;
top(top: number): TableQuery;
where(condition: string, ...args: any[]): TableQuery;
and(condition: string, ...args: any[]): TableQuery;
or(condition: string, ...args: any[]): TableQuery;
toQueryObject(): Object;
}
export var TableQuery: {
new(): TableQuery;
int32Filter(propertyName: string, operation: string, value: string | number): string;
int64Filter(propertyName: string, operation: string, value: string | number): string;
doubleFilter(propertyName: string, operation: string, value: string | number): string;
booleanFilter(propertyName: string, operation: string, value: boolean | string): string;
dateFilter(propertyName: string, operation: string, value: Date | string): string;
guidFilter(propertyName: string, operation: string, value: string | any): string;
binaryFilter(propertyName: string, operation: string, value: Buffer | string): string;
stringFilter(propertyName: string, operation: string, value: string): string;
combineFilters(filterA: string, operatorString: string, filterB: string): string;
};
结尾
使用NoSQL的初衷是因为它比关系型数据库快速且免费,但是CosmosDB提供的服务功能超乎想象地强大。如果之前是使用MongoDB或Cassandra,可能可以以较低的学习成本进行迁移。
如果你能指出這裡可以使用distinct和order by的地方,我會非常感激。
在开始工作前,请仔细阅读文件。