En esta página se describen los requisitos del esquema de Spanner, cómo usar el esquema para crear relaciones jerárquicas y las funciones del esquema. También introduce tablas intercaladas, que pueden mejorar el rendimiento de las consultas al consultar tablas en una relación superior-secundaria.
Un esquema es un espacio de nombres que contiene objetos de base de datos, como tablas, vistas, índices y funciones. Los esquemas se usan para organizar objetos, aplicar privilegios de control de acceso pormenorizado y evitar conflictos de nombres. Debes definir un esquema para cada base de datos de Spanner.
También puede segmentar y almacenar filas en su tabla de base de datos en diferentes regiones geográficas. Para obtener más información, consulta el artículo Introducción a las particiones geográficas.
Datos con tipado fuerte
Los datos de Spanner tienen un tipado fuerte. Los tipos de datos incluyen tipos escalares y complejos, que se describen en Tipos de datos en GoogleSQL y Tipos de datos de PostgreSQL.
Selecciona una clave principal
Las bases de datos de Spanner pueden contener una o varias tablas. Las tablas se estructuran en filas y columnas. El esquema de la tabla define una o varias columnas de la tabla como clave principal de la tabla, que identifica de forma única cada fila. Las claves principales siempre se indexan para buscar filas rápidamente. Si quiere actualizar o eliminar filas de una tabla, esta debe tener una clave principal. Una tabla sin columnas de clave principal solo puede tener una fila. Solo las bases de datos con dialecto GoogleSQL pueden tener tablas sin clave principal.
A menudo, tu aplicación ya tiene un campo que se adapta de forma natural para usarlo como clave principal. Por ejemplo, en una tabla Customers, puede haber un CustomerId proporcionado por la aplicación que funcione bien como clave principal. En otros casos, es posible que tengas que generar una clave principal al insertar la fila. Normalmente, se trata de un valor entero único sin importancia empresarial (una clave principal subrogada).
En cualquier caso, debes evitar crear puntos de acceso con la clave principal que elijas. Por ejemplo, si insertas registros con un número entero que aumenta de forma regular como clave, siempre debes insertarlo al final del espacio de clave. Esto no es recomendable porque Spanner divide los datos entre servidores por intervalos de claves, lo que significa que las inserciones se dirigirán a un solo servidor, lo que creará un punto de acceso. Hay técnicas que pueden distribuir la carga entre varios servidores y evitar los puntos de acceso:
- Comprimir la clave y almacenarla en una columna. Usar la columna comprimida (o la columna comprimida y las columnas con la clave única juntas) como la clave principal.
- Cambiar el orden de las columnas de la clave principal.
- Utilizar un identificador único universal (UUID). Se recomienda la versión 4 del UUID, ya que usa valores aleatorios en los bits de orden superior. No utilices un algoritmo UUID (como el UUID de la versión 1) que almacene la marca de tiempo en los bits de orden superior.
- Invertir los bits de los valores secuenciales.
Relaciones de tablas superiores y secundarias
Hay dos formas de definir relaciones entre tablas superiores y secundarias en Spanner: intercalado de tablas y claves externas.
El intercalado de tablas de Spanner es una buena opción para muchas relaciones entre tablas superiores y tablas secundarias. Con la intercalación, Spanner coloca físicamente las filas secundarias junto a las filas principales en el almacenamiento. La colocación conjunta puede mejorar el rendimiento de forma significativa. Por ejemplo, si tienes una tabla Customers y una tabla Invoices, y tu aplicación obtiene con frecuencia todas las facturas de un cliente, puedes definir Invoices como una tabla secundaria intercalada de Customers. Al hacerlo, estás declarando una relación de ubicación de datos entre dos tablas independientes. Estás indicando a Spanner que almacene una o varias filas de Invoices con una fila de Customers. Esta relación entre elementos principales y secundarios se aplica cuando se intercala con la cláusula INTERLEAVE IN PARENT. INTERLEAVE IN comparten las mismas características de intercalado de filas físicas, pero Spanner no aplica la integridad referencial entre la tabla superior y la secundaria.
Para asociar una tabla secundaria con una tabla superior, debes usar DDL que declare la tabla secundaria como intercalada en la tabla superior e incluir la clave principal de la tabla superior como la primera parte de la clave principal compuesta de la tabla secundaria.
Para obtener más información sobre la intercalación, consulta Crear tablas intercaladas.
Las claves externas son una solución más general para tablas superiores y secundarias, y se pueden usar en otros casos prácticos. No están limitadas a columnas de claves principales. Las tablas pueden tener varias relaciones de claves externas, tanto como tabla superior en algunas relaciones como tabla secundaria en otras. Sin embargo, una relación de clave externa no implica que las tablas se encuentren en la misma ubicación en la capa de almacenamiento.
Google recomienda que elijas entre representar las relaciones entre tablas superiores y secundarias en forma de tablas intercaladas o claves externas, pero no usar las 2 funciones a la vez. Para obtener más información sobre las claves externas y su comparación con las tablas intercaladas, consulta el resumen de las claves externas.
Claves principales de tablas intercaladas
Para el entrelazado, cada tabla debe tener una clave principal. Si declaras que una tabla es una secundaria intercalada de otra tabla, la tabla debe tener una clave principal compuesta que incluya todos los componentes de la clave principal de la tabla superior, en el mismo orden y, normalmente, una o más columnas adicionales de la tabla secundaria.
Spanner almacena las filas ordenadas por los valores de clave principal, con las filas secundarias insertadas entre las filas principales. Consulta una ilustración de las filas intercaladas en la sección Crear tablas intercaladas de esta página.
En resumen, Spanner puede colocar filas de tablas relacionadas en ubicaciones compartidas. En los ejemplos de esquemas se muestra el aspecto de este diseño físico.
División de bases de datos
Puedes definir jerarquías de relaciones entre elementos superiores y secundarios intercalados de hasta siete niveles de profundidad, lo que significa que puedes colocar filas de siete tablas independientes en el mismo lugar. Si el tamaño de los datos de tus tablas es pequeño, es probable que un solo servidor de Spanner pueda gestionar tu base de datos. Pero ¿qué ocurre cuando tus tablas relacionadas crecen y empiezan a alcanzar los límites de recursos de un servidor individual? Spanner es una base de datos distribuida, lo que significa que, a medida que crece tu base de datos, Spanner divide tus datos en fragmentos denominados "divisiones". Las divisiones individuales pueden moverse de forma independiente entre sí y asignarse a diferentes servidores, que pueden estar en ubicaciones físicas distintas. Un split contiene un intervalo de filas contiguas. Las claves de inicio y fin de este intervalo se denominan "límites de división". Spanner añade y elimina automáticamente límites de divisiones en función del tamaño y la carga, lo que cambia el número de divisiones de la base de datos.
División basada en la carga
Para ver un ejemplo de cómo realiza Spanner la división basada en la carga para mitigar los puntos de acceso de lectura, supongamos que tu base de datos contiene una tabla con 10 filas que se leen con más frecuencia que el resto de las filas de la tabla. Spanner puede añadir límites de división entre cada una de esas 10 filas para que cada una de ellas se gestione en un servidor diferente, en lugar de permitir que todas las lecturas de esas filas consuman los recursos de un solo servidor.
Por lo general, si sigues las prácticas recomendadas para el diseño de esquemas, Spanner puede mitigar los puntos de acceso de forma que el rendimiento de lectura mejore cada pocos minutos hasta que satures los recursos de tu instancia o te encuentres en situaciones en las que no se puedan añadir nuevos límites de división (porque tienes una división que abarca una sola fila sin elementos secundarios intercalados).
Esquemas con nombre
Los esquemas con nombre te ayudan a organizar datos similares. Esto te ayuda a encontrar rápidamente objetos en la consola Google Cloud , aplicar privilegios y evitar colisiones de nombres.
Los esquemas con nombre, al igual que otros objetos de base de datos, se gestionan mediante DDL.
Los esquemas con nombre de Spanner te permiten usar nombres completos (FQNs) para consultar datos. Los FQNs te permiten combinar el nombre del esquema y el nombre del objeto para identificar objetos de la base de datos. Por ejemplo, puede crear un esquema llamado warehouse para la unidad de negocio del almacén. Las tablas que usan este esquema pueden incluir product, order y customer information. También puedes crear un esquema llamado fulfillment para la unidad de negocio de gestión de pedidos.
Este esquema también podría tener tablas llamadas product, order y customer
information. En el primer ejemplo, el FQN es warehouse.product y, en el segundo, fulfillment.product. De esta forma, se evitan confusiones en situaciones en las que varios objetos tienen el mismo nombre.
En el DDL de CREATE SCHEMA, los objetos de tabla tienen un nombre completo (FQN), por ejemplo, sales.customers, y un nombre abreviado, por ejemplo, sales.
Los siguientes objetos de base de datos admiten esquemas con nombre:
TABLECREATEINTERLEAVE IN [PARENT]FOREIGN KEYSYNONYM
VIEWINDEXSEARCH INDEXFOREIGN KEYSEQUENCE
Para obtener más información sobre cómo usar esquemas con nombre, consulta Gestionar esquemas con nombre.
Usar el control de acceso pormenorizado con esquemas con nombre
Los esquemas con nombre te permiten conceder acceso a nivel de esquema a cada objeto del esquema. Esto se aplica a los objetos de esquema que existan en el momento en que concedas acceso. Debe conceder acceso a los objetos que se añadan más adelante.
El control de acceso pormenorizado limita el acceso a grupos completos de objetos de base de datos, como tablas, columnas y filas de la tabla.
Para obtener más información, consulta Conceder privilegios de control de acceso detallado a esquemas con nombre.
Ejemplos de esquemas
En los ejemplos de esquemas de esta sección se muestra cómo crear tablas principales y secundarias con y sin intercalación, y se ilustran los diseños físicos de los datos correspondientes.
Crear una tabla principal
Supongamos que estás creando una aplicación de música y necesitas una tabla que almacene filas de datos de cantantes:
Ten en cuenta que la tabla contiene una columna de clave principal, SingerId, que aparece a la izquierda de la línea en negrita, y que las tablas se organizan por filas y columnas.
Puedes definir la tabla con el siguiente DDL:
GoogleSQL
CREATE TABLE Singers ( SingerId INT64 NOT NULL PRIMARY KEY, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX), );
PostgreSQL
CREATE TABLE singers ( singer_id BIGINT PRIMARY KEY, first_name VARCHAR(1024), last_name VARCHAR(1024), singer_info BYTEA );
Ten en cuenta lo siguiente sobre el esquema de ejemplo:
Singerses una tabla de la raíz de la jerarquía de la base de datos (porque no se ha definido como secundaria intercalada de otra tabla).- En las bases de datos con dialecto GoogleSQL, las columnas de clave principal suelen estar anotadas con
NOT NULL(aunque puedes omitir esta anotación si quieres permitir valoresNULLen las columnas de clave. Para obtener más información, consulte Columnas clave. - Las columnas que no se incluyen en la clave principal se denominan columnas no clave y pueden tener una anotación
NOT NULLopcional. - Las columnas que usan el tipo
STRINGoBYTESen GoogleSQL deben definirse con una longitud, que representa el número máximo de caracteres Unicode que se pueden almacenar en el campo. La especificación de longitud es opcional para los tiposvarcharycharacter varyingde PostgreSQL. Para obtener más información, consulta Tipos de datos escalares en el caso de las bases de datos con dialecto GoogleSQL y Tipos de datos de PostgreSQL en el caso de las bases de datos con dialecto PostgreSQL.
¿Cómo es la disposición física de las filas de la tabla Singers? En el siguiente diagrama se muestran las filas de la tabla