Pregunta

Estamos creando una aplicación que puede necesitar ser replicada en muchos servidores (espero que no, pero no hay forma de saber si los clientes necesitarán su propia copia cliente / servidor hasta después de que lancemos el producto en línea).

Dado que se desconoce el número de servidores, he decidido usar GUID para cualquier ID de tabla transaccional. Como cada cliente tiene su propia base de datos, tengo la intención de usar el valor predeterminado NEWSEQUENTIALID (), y la tabla más grande agregará no más de 1.5 millones de filas por año (pero en promedio 15,000 filas), no espero mucho problema de rendimiento .

Sin embargo, no estoy seguro de cómo manejar los casos en los que queremos que la clave externa indique 'ninguno seleccionado'. Por ejemplo, un cliente tiene un solo usuario administrador. Esto se configura como una clave externa (login_id) para login.id (un GUID). Sin embargo, si un cliente aún no tiene un usuario administrador, ¿cómo podríamos configurar fácilmente un " Ninguno seleccionado " ¿llave?

En aplicaciones anteriores, utilizamos columnas IDENTITY e insertamos una entrada ficticia en la mayoría de las tablas con un ID de 0. ¿Existe un enfoque aceptado para proporcionar una funcionalidad similar con un GUID?

¿Fue útil?

Solución

Tienes 3 opciones:

1) En la tabla a la que se hace referencia, agregue la fila de valor en blanco con una guía de todos los ceros, luego haga un enlace a este registro

2) Simplemente almacene un nulo para las referencias en blanco

3) No tiene los registros en blanco en la tabla de referencia, pero almacene un guid con cero. Esto puede causar problemas si las uniones se realizan en la base de datos o con informes. Tendrá que codificar para este caso especial.

Yo diría que 1 y 2 son las únicas buenas opciones.

Otros consejos

La única forma segura de hacer esto es establecer el valor FK en NULL. Si necesita replicar datos entre varios servidores, asegúrese de que cada tabla que replica tenga GUID como sus claves principales, las relaciones de clave externa nunca son un problema.

La replicación puede funcionar de manera muy simple de esta manera: replicar las inserciones y actualizaciones primero en el orden de la tabla padre a hijo, luego replica los registros eliminados de hijo a padre. (orden inverso)

Espero que esto ayude.

Puede que me esté perdiendo algo realmente obvio aquí, pero ¿no puedes configurarlo en NULL?

Haga que el campo de clave foránea en la tabla secundaria NULL se pueda mantener y mantenga el campo NULL cuando no haya un usuario administrador. Valores mágicos como " 0 " Las columnas de identidad son un desastre que está por ocurrir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top