Diseño de tablas

Descubra cómo diseñar y configurar tablas en Oracle NoSQL Database Cloud Service.

Tabla

Una tabla es una recopilación de filas, donde cada fila contiene un registro de datos. Cada fila de tabla consta de campos de datos y claves que se definen al crear una tabla. Además, una tabla tiene un almacenamiento concreto, puede admitir un rendimiento máximo de lectura y escritura definido y tiene un tamaño máximo.

Aprenda los siguientes conceptos antes de diseñar una tabla en Oracle NoSQL Database Cloud Service:

  • Campos de tabla: las tablas se crean mediante DDL (lenguaje de definición de datos) que define los tipos de datos y las claves primarias que se utilizan para la tabla. Oracle NoSQL Database Cloud Service admite varios tipos de datos, como diversos tipos numéricos, cadenas, binarios, registros de hora, mapas, matrices, registros y un tipo especial de JSON que puede contener datos JSON válidos. Una aplicación puede elegir tipos de datos para los campos de tabla según el modelo de datos. Consulte Tipos de datos soportados para ver una lista completa de los tipos de datos soportados en Oracle NoSQL Database Cloud Service.

    Consulte Campos de tabla para obtener más información sobre los campos de tabla.

  • Claves primarias y de partición horizontal: cada tabla debe tener uno o más campos designados como clave primaria. Esta designación se produce al crear la tabla y no se puede cambiar después. Una clave primaria identifica de forma única todas las filas de la tabla. En el caso más simple, una clave primaria se utiliza para recuperar una fila concreta para examinarla o modificarla.

    Las claves de partición horizontal identifican los campos de clave primaria significativos en términos de almacenamiento de particiones horizontales. Es decir, se garantiza que las filas que contienen los mismos valores para todas las claves de partición se almacenen en la misma partición. Este almacenamiento de particiones horizontales es importante para algunas operaciones que prometen la atomicidad de los resultados.

    Consulte Claves primarias y claves de partición horizontal para obtener más información.

  • Índices: los índices representan una forma alternativa de recuperar filas de tablas. Normalmente, se recuperan filas de la tabla utilizando la clave primaria. Al crear un índice, puede recuperar de manera más eficaz filas basadas en campos que no forman parte de la clave primaria. Los índices proporcionan mayor capacidad de consulta, pero consumen tanto recursos de almacenamiento como de rendimiento.

    Consulte Creación de tablas e índices para aprender a crear un índice.

  • Capacidad: al crear una tabla, también especifica los recursos de almacenamiento y rendimiento disponibles para la tabla. Las operaciones de lectura y escritura en la tabla están limitadas por la capacidad de rendimiento de lectura y escritura que defina. La cantidad de espacio que puede utilizar la tabla está limitada por la capacidad de almacenamiento.

    Consulte Estimación de la capacidad para obtener información sobre cómo estimar la capacidad que debería especificar para la tabla.

    Consulte Gestión de la capacidad para obtener más información sobre cómo gestionar la capacidad de la tabla.

  • Tiempo de duración (TTL): el tiempo de duración le permite forzar la caducidad automática de las filas de la tabla. El TTL se expresa como el tiempo que los datos pueden estar activos en la tabla. Los datos que han alcanzado el valor de tiempo de espera de vencimiento ya no se pueden recuperar y no aparecen en ninguna operación de lectura.

    Consulte Tiempo de actividad para obtener más información.

  • Columnas de identidad: Las columnas de identidad son un tipo especial de columnas que obtienen sus valores automáticamente asignados por Oracle NoSQL Database Cloud Service. Estos valores se generan a partir de un generador de secuencia. Las columnas de identidad no están soportadas desde la consola de NoSQL Database Cloud Service. Para obtener más información sobre las columnas de identidad, consulte Columna de identidad desde SQL Reference para Oracle NoSQL Database. Para obtener información sobre cómo acceder a columnas de identidad desde una aplicación Oracle NoSQL Database Cloud Service, consulte Inserción de valores IDENTITY de forma programada en Introducción a NoSQL Database Table Java Driver.
  • Ciclos de vida de la tabla: cuando se crean, modifican o suprimen las tablas, pasan por distintos estados del ciclo de vida.

    Consulte Ciclos de vida y estados de tabla para obtener información sobre el ciclo de vida de una tabla.

Tipos de datos soportados

Oracle NoSQL Database Cloud Service soporta muchos tipos de datos comunes.

Tipo de datos Descripción

BINARY

Secuencia de cero o más bytes.

FIXED_BINARY Matriz de bytes de tamaño fijo.

BOOLEAN

Tipo de datos con uno de los dos valores posibles: TRUE o FALSE.

DOUBLE

Un número de punto flotante de 64 bits (8 bytes) de largo.

FLOAT

Número de punto flotante de 32 bits (4 bytes) de largo

LONG

Número entero largo de 64 bits ( 8 bytes) de largo.

INTEGER

Número entero largo de 32 bits (4 bytes) de largo.

STRING

Secuencia de caracteres Unicode.

NUMBER

Número decimal de precisión arbitraria.

TIMESTAMP

Un punto en el tiempo con una precisión. La precisión afecta al tamaño y al uso del almacenamiento. El registro de hora se almacena y gestiona con la zona horaria UTC (hora universal coordinada).

ENUM

Enumeración representada como una matriz de cadenas. Los valores ENUM son identificadores simbólicos (tokens) y se almacenan como un pequeño valor entero que representa una posición ordenada en la enumeración.

ARRAY

Recopilación ordenada de cero o más elementos tipificados. Las matrices que no están definidas como JSON no pueden contener valores NULL.

Las matrices declaradas como JSON pueden contener cualquier elemento JSON válido, incluido el valor especial "null", que es relevante para JSON.

MAP

Recopilación sin ordenar de cero o más pares de clave-elemento, donde todas las claves son cadenas y todos los elementos son del mismo tipo. Todas las claves deben ser únicas. Los pares de clave-elemento se denominan campos, las claves son nombres de campo y los elementos asociados son valores de campo. Los valores de campo pueden tener diferentes tipos, pero las asignaciones no pueden contener valores de campo NULL.

RECORD

Recopilación fija de uno o más pares de clave-elemento, donde todas las claves son cadenas. Todas las claves de un registro deben ser únicas.

JSON

Cualquier dato de JSON válido.

Campos de tabla

Descubra cómo diseñar y configurar datos mediante campos de tabla.

Una aplicación puede utilizar tablas sin esquema, donde una fila consta de campos de clave y un solo campo de datos JSON. Una tabla sin esquema ofrece flexibilidad en cuanto a los elementos que se pueden almacenar en una fila.

De manera alternativa, la aplicación puede utilizar tablas de esquema fijo, donde todos los campos de la tabla se definen con un tipo concreto.

Las tablas de esquema fijo con datos tipificados son más seguras de usar en términos de aplicación y eficacia del almacenamiento. Aunque es posible modificar el esquema de tablas de esquema fijo, la estructura de la tabla no se puede cambiar fácilmente. Una tabla sin esquema es flexible y la estructura de la tabla se puede modificar fácilmente.

Por último, una aplicación también puede utilizar un enfoque de modelo de datos híbrido en el que una tabla puede tener campos de datos JSON y datos tipificados.

Los siguientes ejemplos muestran cómo diseñar y configurar datos para los tres enfoques.

Ejemplo 1: Diseño de una tabla sin esquema

Dispone de varias opciones para almacenar información sobre los patrones de exploración en la tabla. Una opción es definir una tabla que use el ID de cookie como clave y mantenga los datos de segmentación de público como un solo campo JSON.

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

En este caso, la tabla audience_info puede contener un objeto JSON como:

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

La aplicación tendrá un campo clave y un campo de datos para esta tabla. Tiene flexibilidad a la hora de seleccionar la información que desea almacenar en el campo audience_data. Por lo tanto, puede cambiar fácilmente los tipos de información disponibles.

Ejemplo 2: Diseño de una tabla de esquema fijo

Puede almacenar información sobre los patrones de exploración creando la tabla con campos declarados más explícitamente:

// 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));

En este ejemplo, la tabla tiene un campo de clave y dos campos de datos. Los datos son más compactos y puede asegurarse de que todos los campos de datos son precisos.

Ejemplo 3: Diseño de una tabla híbrida

Puede almacenar información sobre los patrones de exploración con los campos de datos tipificados y JSON de la tabla.

// 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));

Claves primarias y claves de partición horizontal

Conozca la finalidad de las claves primarias y las claves de partición al diseñar la aplicación.

Las claves primarias y las claves de partición son elementos importantes del esquema y ayudan a acceder y distribuir los datos de forma eficiente. Las claves primarias y las claves de partición horizontal solo se crean cuando se crea una tabla. Permanecen en el mismo sitio durante toda la vida útil de la tabla y no se pueden modificar ni borrar.

Claves primarias

Debe designar una o más columnas de clave primaria al crear la tabla. Una clave primaria identifica de forma única todas las filas de la tabla. En el caso de operaciones sencillas de creación, lectura, actualización y supresión, Oracle NoSQL Database Cloud Service utiliza la clave primaria para recuperar una fila específica para leer o modificar. Imagine, por ejemplo, que una tabla tiene los siguientes campos:

  • productName

  • productType

  • productLine

Ya sabe que el nombre del producto es importante y único para cada fila, así que defina productName como clave primaria. A continuación, recupera las filas de interés basándose en productName. En ese caso, utilice una sentencia como esta para definir la tabla.

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

Claves de partición

El objetivo principal de las claves de partición horizontal es distribuir los datos en el cluster de Oracle NoSQL Database Cloud Service para una mayor eficacia y ubicar localmente los registros que comparten la clave de partición horizontal para facilitar la referencia y el acceso. Los registros que comparten la clave de partición horizontal se almacenan en la misma ubicación física y se puede acceder a ella de forma atómica y eficiente.

El diseño de la clave primaria y de partición tiene implicaciones sobre la ampliación y el logro del rendimiento global aprovisionado. Por ejemplo, cuando los registros comparten claves de partición horizontal, puede suprimir varias filas de la tabla en una operación atómica o recuperar un subconjunto de filas de la tabla en una sola operación atómica. Además de habilitar la escalabilidad, las claves de partición bien diseñadas pueden mejorar el rendimiento, ya que necesitan menos ciclos para colocar los datos u obtener datos de una sola partición.

Por ejemplo, suponga que designa tres campos de clave primaria:

PRIMARY KEY (productName, productType, productLine)

Puesto que sabe que la aplicación realiza consultas frecuentes con las columnas productName y productType, sería conveniente especificar dichos campos como claves de partición horizontal. La designación de clave de partición horizontal garantiza que todas las filas de estas dos columnas se almacenen en la misma partición horizontal. Si estos dos campos no son claves de partición horizontal, las columnas consultadas con más frecuencia se pueden almacenar en cualquier partición horizontal. Por tanto, para localizar todas las filas de ambos campos, es necesario explorar todo el almacenamiento de datos, en lugar de una partición horizontal.

Las claves de partición horizontal designan almacenamiento en la misma partición horizontal para facilitar la consulta eficaz de valores de clave. Sin embargo, como desea que los datos se distribuyan entre las particiones horizontales para obtener un mejor rendimiento, debe evitar claves de partición horizontal que tengan pocos valores únicos.
Nota

Si no designa claves de partición horizontal al crear una tabla, Oracle NoSQL Database Cloud Service utiliza las claves primarias para la organización de particiones horizontales.

Factores importantes que se deben tener en cuenta al seleccionar una clave de partición horizontal

  • Cardinalidad: los campos de cardinalidad baja, como el país de origen de un usuario, agrupan los registros en unas pocas particiones horizontales. A su vez, dichas particiones horizontales necesitan un reequilibrado frecuente de los datos, lo cual aumenta el riesgo de problemas en las particiones horizontales más usadas. En su lugar, cada clave de partición horizontal debe tener una cardinalidad alta, donde la clave de partición horizontal puede expresar un segmento par de registros en el conjunto de datos. Por ejemplo, los números de identidad como customerID, userID o productID son buenos candidatos para una clave de partición horizontal.

  • Atomicidad: solo los objetos que comparten la clave de partición horizontal pueden participar en una transacción. Si necesita transacciones ACID que abarquen varios registros, seleccione solo una clave de partición horizontal que permita cumplir dicho requisito.

¿Cuáles son las mejores prácticas que se deben seguir?

  • Distribución uniforme de claves de partición horizontal: cuando las claves de partición horizontal se distribuyen de manera uniforme, ninguna partición horizontal limita la capacidad del sistema.

  • Aislamiento de consultas: las consultas se deben dirigir a una partición horizontal específica para maximizar la eficiencia y el rendimiento. Si las consultas no se aíslan a una sola partición horizontal, la consulta se aplica a todas las particiones horizontales, lo cual resulta menos eficaz y aumenta la latencia de la consulta.

Consulte Creación de tablas e índices para aprender a asignar claves primarias y de particiones horizontales utilizando el objeto TableRequest.

Tiempo de duración

Aprenda a especificar los tiempos de vencimiento de las tablas y las filas mediante la función de tiempo de actividad (TTL).

Muchas aplicaciones gestionan datos con una vida útil limitada. El tiempo de actividad (TTL) es un mecanismo que permite definir un periodo en las filas de la tabla, tras el cual las filas caducan automáticamente y ya no están disponibles. Es la cantidad de tiempo que los datos pueden permanecer en Oracle NoSQL Database Cloud Service. Los datos que alcanzan el tiempo de vencimiento ya no se pueden recuperar y no aparecen en ninguna estadística de almacenamiento.

Por defecto, todas las tablas creadas tienen un valor de TTL igual a cero, lo que indica que no existe tiempo de vencimiento. Puede declarar un valor de TTL al crear una tabla indicando un número seguido de HOURS o DAYS. Las filas de la tabla heredan el valor de TTL de la tabla en la que residen, a menos que se defina explícitamente un valor de TTL para las filas de la tabla. La definición de un valor de TTL de una fila sustituye el valor de TTL de la tabla. Si cambia el valor de TTL de la tabla y la fila ya tenía un valor de TTL establecido, prevalece el valor de la fila.

Puede actualizar el valor de TTL de una fila de la tabla en cualquier momento antes de que la fila alcance el tiempo de vencimiento. Los datos que hayan vencido no serán accesibles. Por lo tanto, el uso de valores de TTL es más eficaz que suprimir las filas manualmente, ya que se evita la sobrecarga de escritura de una entrada del log de la base de datos para la supresión de datos. Los datos que hayan vencido se borran del disco después de la fecha de vencimiento.

Ciclos de vida y estados de tabla

Obtenga información sobre los diferentes estados de tabla y su importancia (proceso de ciclo de vida de tabla).

Cada tabla pasa por una serie de estados diferentes, desde la creación de la tabla hasta la supresión (borrado). Por ejemplo, una tabla con el estado DROPPING no puede continuar con el estado ACTIVE, mientras que una tabla en estado ACTIVE puede cambiar al estado UPDATING. Puede realizar un seguimiento de los distintos estados de una tabla controlando el ciclo de vida de la tabla. En esta sección se describen los distintos estados de tabla.

A continuación, aparece la descripción de table-state.png

Estado de tabla Descripción

CREATING

La tabla está en proceso de creación. No está lista para usarse.

UPDATING

Actualización de la tabla en curso. No se pueden realizar más modificaciones en la tabla mientras se encuentra en este estado.

Una tabla está en el estado UPDATING cuando:

  • Se están cambiando los límites de la tabla
  • Evoluciona el esquema de la tabla.
  • Se agrega o borra el índice de una tabla.

ACTIVE

La tabla se puede utilizar en el estado actual. Puede que la tabla se haya creado o modificado recientemente, pero el estado de la tabla es ahora estable.

DROPPING

La tabla se está borrando y no se puede acceder a ella con ningún fin.

DROPPED

La tabla se ha borrado y ya no existe para las actividades de lectura, escritura o consulta.
Nota

Después de borrarla, se puede volver a crear una tabla con el mismo nombre.