Compartir a través de


Seleccionar una clave principal apropiada para un entorno distribuido (Sync Services)

Para las tablas que participan en una sincronización incremental, Sync Services for ADO.NET requiere la identificación inequívoca de cada fila (esto no es necesario para la sincronización de instantáneas en el cliente y el servidor). Normalmente, las filas se identifican mediante una clave principal definida en la base de datos servidor o del mismo nivel. En los entornos distribuidos, debe ser particularmente cuidadoso cuando seleccione el tipo de columna utilizado como clave principal. Las claves principales deben ser únicas en todos los nodos y no pueden volver a usarse: si se elimina una fila, su clave principal no debe usarse con otra fila. Si varios nodos usan la misma clave principal, puede producirse una colisión de claves principales. Este problema se produce con todo tipo de entornos distribuidos, no solamente en Sync Services. En este tema se describen varias opciones que puede elegir para las claves principales, y se explica si son apropiadas para los entornos distribuidos.

Columnas de incremento automático (Identity)

Los arquitectos de bases de datos muchas veces seleccionan como clave principal una columna de incremento automático. Esta propiedad de incremento automático (la propiedad IDENTITY en SQL Server) genera un valor nuevo para cada registro que se inserta en una tabla. El nuevo valor se genera aumentando o disminuyendo el valor actual (el valor de inicialización) en una cantidad fija (el incremento) y asignando el resultado a la fila insertada. Las columnas de incremento automático normalmente usan tipos de datos compactos, como los enteros. El resultado puede ser un índice clúster más compacto, combinaciones más eficaces y menos E/S en las consultas de la tabla subyacente.

No obstante, dado que las propiedades de valor de inicialización e incremento son fijas y se seleccionan entre un número finito de valores posibles, la probabilidad de una colisión de claves primarias es muy alta. Este tipo de clave es apropiado para los escenarios de sólo descarga con almacenamiento de datos en caché. En estos escenarios, el servidor o un elemento del mismo nivel designado debe ser el único nodo que genere nuevos valores de clave principal. Por consiguiente, se garantiza que estos valores sean únicos en todos los nodos de la topología. Las columnas de incremento automático también son apropiadas para los escenarios de sólo carga y bidireccionales si sólo se realizan operaciones de inserción en uno de los nodos. En estos escenarios, las operaciones de inserción normalmente sólo tienen lugar en el servidor o en un elemento del mismo nivel designado; y las operaciones de actualización y, posiblemente las de eliminación, se realizan en uno o varios clientes. Si necesita realizar operaciones de inserción en varios nodos, use uno de los métodos que se describen más adelante en este tema.

GUID

El uso de un GUID (una columna uniqueidentifier en SQL Server) como clave principal garantiza la unicidad en cualquier número de nodos y elimina las colisiones de clave principal que pueden producirse con las columnas de incremento automático. No obstante, el uso de un GUID en la clave principal tiene estas consecuencias:

  • El tipo de datos grande (16 bytes) aumenta el tamaño del índice clúster, lo cual puede afectar de forma adversa a las operaciones habituales, como las combinaciones.

  • La generación no ordenada de GUID causa la inserción de filas en ubicaciones al azar en el índice clúster. Esto, a su vez, puede causar la fragmentación del índice clúster, lo cual puede afectar negativamente a la E/S requerida para las consultas de la tabla subyacente.

    En SQL Server 2005 y versiones posteriores, puede usar los GUID generados por la función NEWSEQUENTIALID() en orden secuencial para ayudar a eliminar la fragmentación.

Claves que incluyen un identificador de nodo

Con este enfoque, se usa una clave que combina un valor único en el nodo servidor o cliente con un valor que es único en la topología. Por ejemplo, en la sincronización del cliente y servidor, podría usar una columna de incremento automático (única en el nodo) combinada con una columna que almacena un valor hash del identificador que Sync Services asigna a cada cliente (el ClientId que es único en la topología). Después crearía una clave principal compuesta que contuviera esas dos columnas. Como alternativa, también puede desarrollar un sistema que genere valores para cada fila insertada, de manera que pueda incluir el identificador de la fila y el del cliente en una misma columna.

Claves naturales

Con esta estrategia, no se usa una clase de clave fabricada, sino una clave de empresa para identificar los registros de manera inequívoca. Por ejemplo, una tabla utilizada para almacenar información de los clientes podría usar la columna del número de seguridad social como clave principal, en lugar de una columna de identidad. El inconveniente de este planteamiento es que la clave principal podría ser grande si se necesitaran varias columnas para identificar de forma única un registro. Asimismo, esta clave compuesta debe propagarse a otras tablas por compatibilidad con una o más relaciones de clave externas. A su vez, estas relaciones afectan adversamente al rendimiento de las combinaciones.

Inserción en línea

Si las soluciones anteriores no son apropiadas y el escenario requiere algunas operaciones de inserción en un cliente, la aplicación podría insertar directamente estas filas en el servidor. Posteriormente, en la próxima sincronización se descargarán e insertarán las filas nuevas en el cliente. Dado que los valores de clave principal se generan en el servidor, no se producirán colisiones de clave principal.

Vea también

Conceptos

Consideraciones sobre el diseño y la implementación de aplicaciones (Sync Services)