在 Oracle NoSQL Database Cloud Service 中设计表

了解如何在 Oracle NoSQL Database Cloud Service 中设计和配置表。

本文章包含以下主题:

表字段

了解如何使用表字段设计和配置数据。

应用程序可以选择使用无模式表,其中行由键字段和单个 JSON 数据字段组成。无模式表提供了在行中存储的内容的灵活性。

或者,应用程序可以选择使用固定的方案表,其中所有表字段都定义为特定类型。

从实施和存储效率的角度来看,具有类型化数据的固定模式表更安全。尽管可以修改固定方案表的方案,但无法轻松更改其表结构。无模式表非常灵活,可以轻松修改表结构。

最后,应用程序还可以使用混合数据模型方法,其中表可以具有键入的数据和 JSON 数据字段。

以下示例演示了如何为这三种方法设计和配置数据。

示例 1:设计无模式表

您可以在表中存储有关浏览模式的信息。一个选项是定义一个表,该表使用 Cookie ID 作为键并将受众细分数据保留为单个 JSON 字段。

// schema less, data is stored in a JSON field
CREATE TABLE audience_info (
       cookie_id LONG,
       audience_data JSON,
       PRIMARY KEY(cookie_id))

在这种情况下,audience_info 表可以存储 JSON 对象,例如:

{
  "cookie_id": "",
  "audience_data": {
    "ipaddr" : "10.0.00.xxx",
    "audience_segment: {
       "sports_lover" : "2018-11-30",
       "book_reader" :  "2018-12-01"
    }
  }
}

您的应用程序将具有此表的关键字字段和数据字段。您可以灵活地选择在 audience_data 字段中存储信息。因此,您可以轻松更改可用的信息类型。

示例 2:设计固定模式表

通过使用更显式声明的字段创建表,可以存储有关浏览模式的信息:

// fixed schema, data is stored in typed fields.
CREATE TABLE audience_info(
       cookie_id LONG,
       ipaddr STRING,
       audience_segment RECORD(sports_lover TIMESTAMP(9),
                               book_reader TIMESTAMP(9)),
       PRIMARY KEY(cookie_id))

在此示例中,您的表有一个键字段和两个数据字段。您的数据更紧凑,您可以确保所有数据字段都准确无误。

示例 3:设计混合表

您可以在表中同时使用键入的数据字段和 JSON 数据字段来存储有关浏览模式的信息。

// mixed, data is stored in both typed and JSON fields.
CREATE TABLE audience_info (
       cookie_id LONG,
       ipaddr STRING,
       audience_segment JSON,
       PRIMARY KEY(cookie_id))

主键和分片键

了解设计应用程序时主键和分片键的用途。

主键和分片键是方案中的重要元素,可帮助您高效地访问和分发数据。仅当创建表时,才创建主键和分片键。它们在餐桌的使用期限内都会保留下来,不能更改或删除。

主键

创建表时,必须指定一个或多个主键列。主键唯一地标识表中的每一行。对于简单的 CRUD 操作,Oracle NoSQL Database Cloud Service 使用主键检索要读取或修改的特定行。例如,假设一个表包含以下字段:

  • productName

  • productType

  • productLine

根据经验,您知道产品名称对于每一行都非常重要,并且是唯一的,因此您将 productName 设置为主键。然后,根据 productName 检索感兴趣的行。在这种情况下,请使用如下语句定义表。

/* Create a new table called users. */
CREATE TABLE if not exists myProducts 
(
  productName STRING,
  productType STRING,
  productLine INTEGER,
  PRIMARY KEY (productName)
)"

分片键

分片密钥的主要用途是在 Oracle NoSQL Database Cloud Service 集群中分发数据以提高效率,并将共享分片密钥的记录放置在本地,以便于参考和访问。共享分片密钥的记录存储在同一物理位置中,可以原子性和高效地访问。

您的分片密钥设计对扩展和实现预配吞吐量有影响。例如,当记录共享分片键时,可以在原子操作中删除多个表行,或者在单个原子操作中检索表中的行子集。除了实现可扩展性之外,设计良好的分片密钥还可以通过减少将数据放置到单个分片或从单个分片获取数据的周期来提高性能。

例如,假设指定三个主键字段:

PRIMARY KEY (productName, productType, productLine)

由于您知道应用程序经常使用 productNameproductType 列进行查询,因此应将这些字段指定为分片键。分片键指定可确保这两个列的所有行都存储在同一个分片中。如果这两个字段不是分片键,则最常查询的列可以存储在任何分片上。然后,查找这两个字段的所有行需要扫描所有数据存储,而不是一个分片。

分片键在同一分片上指定存储,以便于高效查询键值。但是,由于您希望将数据分布在分片中以获得最佳性能,因此必须避免分片键具有很少的唯一值。

注意:

如果在创建表时未指定分片键,Oracle NoSQL Database Cloud Service 将使用分片组织的主键。

选择分片键时要考虑的重要因素

  • 基数:低基数字段(如用户本国/地区)将记录分组到几个分片上。反过来,这些分片需要频繁的数据重新平衡,从而增加发生热分片问题的可能性。相反,每个分片键应具有高基数,其中分片键可以在数据集中表示均匀的记录片。例如,诸如 customerIDuserIDproductID 之类的标识号是分片键的良好候选项。

  • 原子性:只有共享分片键的对象才能参与事务处理。如果需要跨多个记录的 ACID 事务,请选择一个分片键来满足该要求。

要遵循的最佳做法有哪些?

  • 分片键的统一分布:分片键均匀分布时,没有单个分片限制系统的容量。

  • 查询隔离:查询应定位到特定分片,以最大限度地提高效率和性能。如果没有将查询隔离到单个分片,则查询将应用于效率较低的所有分片,并增加查询延迟。

要了解如何使用 TableRequest 对象分配主键和分片键,请参阅创建表

生存时间

了解如何使用生存时间 (TTL) 功能为表和行指定到期时间。

许多应用程序处理的使用寿命有限的数据。生存时间 (Time-to-Live,TTL) 是一种机制,允许您对表行设置时间范围,之后行将自动过期,并且不再可用。这是允许数据保留在 Oracle NoSQL Database Cloud Service 中的时间量。达到失效时间的数据不能再检索,也不会出现在任何存储统计信息中。

默认情况下,创建的每个表的 TTL 值均为零,表示没有到期时间。创建表时可以声明 TTL 值,用数字指定 TTL,后跟 HOURSDAYS。除非显式设置表行的 TTL 值,否则表行将继承它们所在表的 TTL 值。设置行的 TTL 值将覆盖表的 TTL 值。如果在行具有 TTL 值后更改表的 TTL 值,则行的 TTL 值将持续存在。

可以在行达到到期时间之前随时更新表行的 TTL 值。无法再访问过期的数据。因此,使用 TTL 值比手动删除行更有效,因为避免了为数据删除编写数据库日志条目的开销。到期日后将从磁盘中清除过期数据。

表状态和生命周期

了解不同的表状态及其重要性(表生命周期过程)。

每个表都经历了一系列从表创建到删除(删除)的不同状态。例如,处于 DROPPING 状态的表不能继续处于 ACTIVE 状态,而处于 ACTIVE 状态的表可以更改为 UPDATING 状态。您可以通过监视表生命周期来跟踪不同的表状态。本节介绍各种表状态。

下面是表 state.png 的说明
插图表的说明 -state.png

表状态 说明

CREATING

正在创建该表。它尚未就绪,无法使用。

UPDATING

正在更新表。表处于此状态时,无法进一步修改表。

在以下情况下,表处于 UPDATING 状态:

  • 正在更改表限制
  • 正在演化表方案
  • 添加或删除表索引

ACTIVE

该表可以在当前状态下使用。该表可能是最近创建或修改的,但表状态现在稳定。

DROPPING

正在删除表,无法出于任何目的访问该表。

DROPPED

该表已被删除,读取、写入或查询活动不再存在。

注意:

删除后,可以再次创建同名的表。

表层次

通过 Oracle NoSQL Database,表可以存在于父子关系中。这称为表层次结构。

通过 create table 语句,可以将一个表创建为另一个表的子表,该子表随后会成为新表的父表。这可通过对子表使用组合名称 (name_path) 来完成。组合名称由以点分隔的标识符的数字 N(N > 1) 组成。最后一个标识符是子表的本地名称,第一个 N-1 标识符指向父表的名称。

父 - 子表的特性:
  • 子表继承其父表的主键列。
  • 层次结构中的所有表都具有相同的分片键列,这些分片键列在根表的 create table 语句中指定。
  • 在删除父表的子表之前,不能删除父表。
  • 不在父子表中强制执行引用完整性约束条件。

当需要某种形式的数据规范化时,应考虑使用子表。在建模 1 到 N 关系时,子表也是一个不错的选择,在父子层次结构中写入多个记录时,子表还提供 ACID 事务语义。