ver una todas tablas que listar las identificador estado ejemplos datos consultas bases avanzadas sql sql-server database database-design identity

una - Identificadores únicos pero simples en toda la base de datos en SQL Server



que es un identificador en base de datos (11)

Primero, soy consciente de esta pregunta , y la sugerencia (usando GUID) no se aplica en mi situación.

Quiero UID simples para que mis usuarios puedan comunicar fácilmente esta información por teléfono:

Hola, tengo un problema con el pedido 1584

Opuesto a

Hola, tengo un problema con la orden 4daz33-d4gerz384867-8234878-14

Quiero que sean únicos (toda la base de datos) porque tengo algunos tipos diferentes de ''objetos'' ... hay ID de pedidos, ID de entrega y ID de facturación, y dado que no hay una relación uno a uno entre ellos, No tengo manera de adivinar a qué tipo de objeto hace referencia una ID.

Con identificadores únicos en toda la base de datos, puedo decir de inmediato a qué objeto se está refiriendo mi cliente. Mi usuario puede simplemente ingresar una identificación en una herramienta de búsqueda, y le guardo el extra-clic para refinar aún más lo que está buscando.

Mi idea actual es usar columnas de identidad con diferentes semillas 1, 2, 3, etc., y un valor de incremento de 100.

Sin embargo, esto plantea algunas preguntas:

  • ¿Qué pasa si finalmente obtengo más de 100 tipos de objetos? concedido que podría usar 1000 o 10000, pero algo que no se escala bien "huele"

  • ¿Existe la posibilidad de que la semilla se "pierda" (durante una replicación, un problema de base de datos, etc.?)

  • En términos más generales, ¿hay otros problemas que deba tener en cuenta?

  • ¿es posible utilizar un número no entero (actualmente utilizo bigints) como columnas de identidad, de modo que pueda prefijar el ID con algo que represente el tipo de objeto? (por ejemplo, una columna varchar)

  • ¿sería una buena idea utilizar una "tabla maestra" que contenga solo una columna de identidad, y tal vez el tipo de objeto, de modo que solo pueda insertar una fila cuando necesite una nueva idea? Siento que podría ser un poco exagerado, y me temo que completaría todas mis solicitudes de inserción. Además del hecho de que no podré determinar un tipo de objeto sin mirar la base de datos

  • ¿Hay otras formas inteligentes de abordar mi problema?



¿Por qué no utilizar identidades en todas las tablas, pero cada vez que se lo presente al usuario, simplemente inserte un único carácter para ese tipo? por ejemplo, O1234 es una orden, D123213 es una entrega, etc.? De esa manera no tienes que diseñar un esquema loco ...


¿Tal vez una variante itemType-year-week-orderNumberThisWeek?

o2009-22-93402

Dicho identificador puede consistir en varios valores de columna de base de datos y el software simplemente formateado en una forma de identificador.


El proyecto de programación intencional de MS tenía un sistema GUID-to-word que daba nombres pronunciables de identificaciones aleatorias


Lo implementaría definiendo una tabla raíz genérica. A falta de un mejor nombre, llámalo Entidad. La tabla de Entidad debe tener como mínimo una sola columna de Identidad. También podría incluir otros campos que son comunes a todos sus objetos o incluso metadatos que le dicen que esta fila es un pedido, por ejemplo.

Cada una de sus tablas de Orden, Entrega ... real tendrá una referencia FK de vuelta a la tabla de Entidades. Esto le dará una única columna de ID única

Usar las semillas en mi opinión es una mala idea, y una que podría generar problemas.

Editar

Algunos de los problemas que mencionaste ya. También veo que esto es un problema para rastrear y garantizar que configure todas las nuevas entidades correctamente. Imagine un desarrollador actualizando el sistema dentro de dos años.

Después de escribir esta respuesta, había pensado un poco más acerca de por qué hacías esto, y llegué a la misma conclusión que Matt.


Manéjelo en la interfaz de usuario: agregue una letra (o letras) de prefijo en el número de ID cuando se lo informe a los usuarios. Entonces o472 sería una orden, b531 sería una factura, y así sucesivamente. Las personas se sienten cómodas mezclando letras y dígitos al dar "números" por teléfono, y son más precisas que con dígitos rectos.


Podría usar una columna de autoincrement para generar la identificación única. Luego, tenga una columna calculada que tome el valor de esta columna y la prepenezca con un identificador fijo que refleje el tipo de entidad, por ejemplo, OR1542 y DL1542, representaría la orden # 1542 y la entrega # 1542, respectivamente. Su prefijo podría extenderse tanto como desee y el formato podría organizarse para ayudar a distinguir entre elementos con el mismo valor de autoincremento, digamos OR011542 y DL021542, con los prefijos OR01 y DL02.


Puede crear una tabla maestra UniqueObject con su identidad y un campo de subtipo. Las subtablas (pedidos, usuarios, etc.) tendrían un FK a UniqueObject. INSTEAD OF INSERT desencadenantes deben mantener el dolor al mínimo.


Tuve una situación similar con un proyecto.

Mi solución: de forma predeterminada, los usuarios solo ven los primeros 7 caracteres del GUID.

Es suficientemente aleatorio que las colisiones son extremadamente improbables (1 en 268 millones), y es eficiente para hablar y escribir.

Internamente, por supuesto, estoy usando todo el GUID.


Yo uso un algoritmo alto / bajo para esto. Sin embargo, no puedo encontrar una descripción para este en línea. Debe blog sobre eso.

En mi base de datos, tengo una tabla de identificación con un campo de contador. Esta es la parte alta. En mi aplicación, tengo un contador que va de 0 a 99. Esta es la parte baja. La clave generada es 100 * alta + baja.

Para obtener una clave, hago lo siguiente

initially high = -1 initially low = 0 method GetNewKey() begin if high = -1 then high = GetNewHighFromDatabase newkey = 100 * high + low. Inc low If low = 100 then low = 0 high = -1 return newKey end

El código real es más complicado con bloqueos, etc., pero esa es la esencia general.

Hay varias formas de obtener el alto valor de la base de datos, incluidas las claves automáticas, los generadores, etc. La mejor forma de hacerlo depende de la base de datos que esté utilizando.

Este algoritmo proporciona claves simples mientras evita la mayoría del golpe de DB de buscar una nueva clave cada vez. En las pruebas, encontré que tenía un rendimiento similar a las guías y un rendimiento mucho mejor que recuperar una clave de autoinc en todo momento.


Nos enfrentamos a un problema similar en un proyecto. Lo resolvimos creando primero una tabla simple que solo tiene una fila: un BIGINT configurado como identidad de incremento automático. Y creamos un sproc que inserta una nueva fila en esa tabla, usando valores predeterminados y dentro de una transacción. Luego almacena SCOPE_IDENTITY en una variable, revierte la transacción y luego devuelve la SCOPE_IDENTITY almacenada.

Esto nos da una identificación única dentro de la base de datos sin llenar una tabla.

Si quieres saber a qué tipo de objeto se refiere la ID, perdería la reversión de la transacción y también almacenaría el tipo de objeto junto a la ID. De esta forma, averigüe a qué tipo de objeto se está refiriendo el identificador es solo de una selección (o unión interna) de distancia.