在 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)
因为您知道应用程序经常使用 productName 和 productType 列进行查询,所以将这些字段指定为分片键是合适的。分片关键字指定可保证这两个列的所有行都存储在同一分片上。如果这两个字段不是分片键,则最常查询的列可以存储在任何分片上。然后,为两个字段查找所有行需要扫描所有数据存储,而不是扫描一个分片。
分片密钥在同一分片上指定存储,以便于高效查询密钥值。但是,由于您希望将数据分布在分片中以获得最佳性能,因此必须避免分片键具有很少的唯一值。
注:如果在创建表时未指定分片键,则 Oracle NoSQL Database Cloud Service 将主键用于分片组织。
选择分片密钥时要考虑的重要因素
-
基数:低基数字段(如用户所在国家/地区)将记录分组到几个分片上。反过来,这些分片需要频繁的数据重新平衡,从而增加热分片问题的可能性。相反,每个分片键应具有较高的基数,其中分片键可以表示数据集中的平均记录片。例如,标识号(如
customerID、userID或productID)是分片密钥的合适候选项。 -
原子性:只有共享分片密钥的对象才能参与事务处理。如果需要跨多个记录的 ACID 事务,请选择可让您满足该要求的分片键。
遵循哪些优秀实践?
-
分片密钥的均匀分布:分片密钥均匀分布时,没有一个分片会限制系统的容量。
-
查询隔离:查询应针对特定分片,以最大限度地提高效率和性能。如果未将查询隔离到单个分片,则查询将应用于所有分片,这会降低效率并增加查询延迟。
要了解如何使用 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 状态。您可以通过监视表生命周期来跟踪不同的表状态。本节介绍各种表状态。

| 表状态 | 说明 |
|---|---|
CREATING |
表正在创建过程中。它未就绪,无法使用。 |
UPDATING |
正在更新表。表处于此状态时,无法进一步修改表。 表在以下情况下处于
|
ACTIVE |
该表可以在当前状态下使用。表可能是在最近创建或修改的,但表状态现在是稳定的。 |
DROPPING |
正在删除该表,无法出于任何目的对其进行访问。 |
DROPPED |
表已删除,读取、写入或查询活动不再存在。 注:删除后,可以再次创建同名的表。 |
表层次
Oracle NoSQL Database 允许表存在于父子关系中。这称为表层次。
通过创建表语句,可以将一个表创建为另一个表的子表,然后该表将成为新表的父表。这是通过使用子表的组合名称 (name_path) 完成的。组合名称由数字 N(N > 1) 的标识符组成,这些标识符由点分隔。最后一个标识符是子表的本地名称,第一个 N-1 标识符指向父表的名称。
父子表的特征:
-
子表会继承其父表的主键列。
-
层次结构中的所有表都具有相同的分片键列,这些列在根表的 create table 语句中指定。
-
在删除父表的子表之前,无法删除父表。
-
未在父子表中强制实施引用完整性约束条件。
当需要某种形式的数据规范化时,应考虑使用子表。在对 1 到 N 关系建模时,子表也是一个不错的选择,在父子层次结构中编写多个记录时,子表还提供 ACID 事务处理语义。