使用Azure Cosmos免费创建高分数据库(2):API、数据模型和Azure表格

首先

我之前以为Azure Cosmos DB只是一个普通的NoSQL数据库,所以在之前的文章中开始免费创建了一个高性能数据库。但是看起来似乎不能实现我所期望的功能,除非使用Table API。所以我决定去调查一下Table API。

总结一下,由于Table API没有排序功能,所以无法将其用作高分数据库。

API和数据模型

在Azure Cosmos DB中,您可以在创建数据库账户时选择API和数据模型类型。

種類内容コア(SQL)jsonで保存したデータを、SQLの様な文法でqueryしアクセスするMongoDB 用 Azure Cosmos DB APIAzure Cosmos DB の MongoDB 用 APICassandraAzure Cosmos DB の Cassandra API の概要Azure テーブルAzure Cosmos DB の概要:テーブル APIGremlin(グラフ)Azure Cosmos DB での Gremlin API の概要

MongoDB和Cassandra都是NoSQL数据库。如果原本就在使用,可以在相同的接口(API)下使用它们,并且迁移相对容易。由于本次没有使用过这两个数据库,所以详细信息省略。
Gremlin是一个图数据库。针对本次需求,它的意识过高,所以详细信息省略。

如果你从Azure Portal的控制台上查看由核心(SQL)创建的数据库,你会看到原始的JSON数据并且会产生一种“有些不对劲”的感觉,之后你可能会将其转换为Azure表,但这个决定并不重要,事后反而会后悔不已。

蔚蓝色的表格

具有 PartitionKey 和 RowKey 的键值存储。
当在 Azure 门户控制台中进行确认时,显示了一个带有每个项目标题的表格,给我一种“这就是我熟悉的数据库”的安心感。此外,由于 API 简单且学习成本较低,所以我继续进行工作。

table-api.png

※数据浏览器(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的地方,我會非常感激。

在开始工作前,请仔细阅读文件。

广告
将在 10 秒后关闭
bannerAds