在 Oracle NoSQL Database Cloud Service 中设计表

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

本文包含以下主题:

表字段

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

应用程序可以使用无模式表,其中每行由关键字字段和单个 JSON 数据字段组成。无方案表提供了可在每行中存储的数据的灵活性。实施无模式数据模型的一个选项是 JSON 集合表,该表专为将数据存储和检索为文档的应用程序而设计。在 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 字段中。因此,您可以轻松更改可用的信息类型。

可以使用 JSON 集合表将数据存储为文档,如下所示:

CREATE TABLE audience_info ( cookie_id LONG
PRIMARY KEY(cookie_id)
) AS JSON COLLECTION

插入行时,可以包括 audience_data 字段和任何必需的嵌套字段。每一行表示一个文档,可以包含任意数量的 JSON 字段。

示例 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 设置为主键。然后,根据 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)

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

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

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

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

遵循哪些优秀实践?

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

生存时间

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

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

默认情况下,创建的每个表的 TTL 值均为零,表示没有到期时间。可以在创建表时声明 TTL 值,使用数字指定 TTL,后跟 HOURS 或 DAYS。除非为表行显式设置了 TTL 值,否则表行将继承其所在表的 TTL 值。设置行的 TTL 值会覆盖表的 TTL 值。如果在行具有 TTL 值之后更改表的 TTL 值,则该行的 TTL 值仍然存在。

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

表状态和生命周期

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

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

后面是 table-state.png 的说明

插图 table-state.png 的说明

表状态 说明
CREATING 表正在创建过程中。它未就绪,无法使用。
UPDATING

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

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

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

ACTIVE 该表可以在当前状态下使用。表可能是在最近创建或修改的,但表状态现在是稳定的。
DROPPING 正在删除该表,无法出于任何目的对其进行访问。
DROPPED 表已删除,读取、写入或查询活动不再存在。

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

表层次

Oracle NoSQL Database 允许表存在于父子关系中。这称为表层次。

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

父子表的特征:

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