¿Para qué se usan las claves negativas?

12

Algo nuevo en el uso de bases de datos SQL estándar (actualmente trabajando principalmente con MySQL) No he encontrado muchos usos de esto hasta el momento.

¿Cuándo y por qué es útil tener claves negativas (o más bien firmadas) que indexan una tabla?

Garet Claborn
fuente
55
En primer lugar, quien esté votando sin dejar comentarios, está haciendo un mal servicio. A continuación, la respuesta a esta excelente pregunta.
jcolebrand
1
Este tema es intrigante. Personalmente nunca he oído hablar de este concepto. Esta pregunta nunca debería haber sido rechazada. +1 de mi parte por presentar este concepto.
RolandoMySQLDBA

Respuestas:

13

Toda una clave primaria es un valor que hemos determinado que es el valor de mayor importancia en un registro. Si esa clave es un int con signo, un int sin signo, una cadena, un blob (en realidad, hay límites) o un UUID (o cualquier nombre que tome hoy), el hecho sigue siendo que es una clave, y que es La cosa de suma importancia.

Como no estamos obligados a usar solo números orientados positivamente para nuestras claves, tiene sentido considerar que un int con signo solo irá a ~ 2 mil millones, mientras que un int sin signo irá a ~ 4 mil millones. Pero no hay nada de malo en usar un int con signo, establecer el valor inicial en ~ -2 mil millones y establecer un incremento de uno. Después de ~ 2 mil millones de registros, llegará a "cero" y luego continuará a ~ 2 mil millones.

En cuanto a por qué sería útil tener "claves negativas" en una tabla, esa es la misma pregunta que "por qué es útil tener claves en una tabla". El "valor" de una clave no tiene impacto en su estado como clave. Una clave es una clave es una clave.

Lo importante es si la clave es válida.

En cuanto a por qué sería útil permitir claves que fueran negativas, puedo sugerir algunas razones:

¿Qué sucedería si quisiera indicar las devoluciones en un sistema de ventas como números de pedido de ventas negativos, que coincidían con el número de pedido de ventas positivo, lo que facilita la correlación (esto es ingenuo y está mal diseñado, pero funcionaría en un sentido de "hoja de cálculo").

¿Qué pasaría si quisieras tener una tabla de usuarios e indicar que los que tenían números negativos estaban controlados por el sistema?

Podría continuar, pero en realidad la única razón por la que el número que es negativo es importante es si usted o yo le asignamos importancia. Aparte de eso, no hay una gran razón para que el valor de una clave tenga alguna relación con la clave misma.

jcolebrand
fuente
Editado el bit de 'ocurrencia de nicho', ya que es más que probable un malentendido debido a la inexperiencia. LecturA INTERESANTE. Me estaba imaginando que habría una situación en la que el valor negativo de la clave era de alguna manera útil en la codificación (es decir, sin decidir que significa algo en particular), pero esto es muy útil para pensar cuando tienes una división fuerte en dos grupos y no no quiero usar un bool extra: p
Garet Claborn
1
@Garet ~ Entonces, usted hace un buen comentario: "el valor de la clave fue de alguna manera útil en la codificación" y uso mis claves de vez en cuando de esa manera, pero eso no tiene nada que ver con el aspecto de la base de datos. La base de datos es un almacén. La aplicación que consume los datos, por otro lado, se preocupa por los valores . Pero sí, ese +/- booleano es un buen truco, he visto que se usa muchas veces para tal efecto.
jcolebrand
2
-1 por implicar que valores de doble propósito como este no son una mala idea. ¿Necesitas un int y un bool? Usa un int y un bool.
Jack dice que intente topanswers.xyz
1
@JackPDouglas No recuerdo haber animado a la gente a hacer eso, recuerdo estrictamente que implica que el campo y sus datos son dos cosas diferentes. Gracias por al menos ofrecer comentarios constructivos sobre su voto negativo, pero no puedo decir que esa observación signifique algo a la luz del concepto de "para qué se usan las claves negativas", ya que es un problema de lógica de aplicación, no un problema de la capa de base de datos . Quería resaltar cómo se usan esas cosas en la capa de aplicación, pero en la capa de la base de datos no tienen ningún significado.
jcolebrand
1
@JackPDouglas ~ Usé ese ejemplo en particular porque hay un sitio muy conocido (red de sitios) del que quizás hayas oído que hace exactamente eso, así que no quiero desestimarlo, porque es válido "truco". Echa un vistazo a este usuario dba.stackexchange.com/users/-1/community y dime cuál es su ID. Casi puedo asegurarle que el ID de usuario es la clave principal (y en muchas otras tablas una clave externa). El hecho de que sea un mal diseño de la aplicación para usted no significa que no sea válido. Pero una vez más, eso no es diseño de base de datos, es diseño de dominio. De acuerdo, la lógica de base de datos lo admite
jcolebrand
10

Si estamos hablando de columnas de identidad o de numeración automática, el valor en sí mismo no debería tener significado. (A veces lo hace, según los usuarios de chat de SO mencionados por drachenstern, que he hecho antes)

Sin embargo, generalmente perderías la mitad de tu rango si estás usando enteros con signo.
Consulte: ¿Qué hacer cuando un campo en una tabla se acerca al número máximo de 32 bits con signo o sin signo?

Otro ejemplo: en escenarios de replicación pequeños, el uso de valores negativos para un sitio y positivos para otro proporciona un conocimiento implícito de la fuente de cualquier fila dada.

gbn
fuente
y asegúrese de restringir de alguna manera los valores ingresados ​​en cada sitio; de lo contrario, terminará en un horrible desastre cuando su "conocimiento implícito" resulte estar equivocado.
Jack dice que intente topanswers.xyz
@JackPDouglas: usarías NOT FOR REPLICATION para evitar generar valores en el sitio incorrecto
gbn
junto con las restricciones de verificación ? Además, ¿hay un MySQL (u otro) análogo de NOT FOR REPLICATIONeso que conoces?
Jack dice que intente topanswers.xyz
@JackPDouglas: lo siento, no estoy seguro acerca de SQL Server no
gbn
8

No todos los sistemas de bases de datos admiten tipos enteros sin signo, MSSQL es uno de los que no. En estos casos, los valores negativos son posibles en los campos de clave entera simplemente porque son posibles en el tipo (podría usar reglas o desencadenantes para bloquearlos, como se muestra en este ejemplo , pero probablemente no es necesario agregar la sobrecarga de aplicar tales reglas a cada inters / actualización).

En lo que respecta a la base de datos, el valor real de una clave primaria no importa siempre que sea único dentro de la tabla. Para ello, -42 y 42 son solo dos números diferentes de la misma manera que son 42 y 69, lo que significa que su código solo le transmitirá la negatividad o no del valor.

No admitir tipos enteros sin signo es probablemente una decisión de diseño basada en la reducción de la complejidad, es decir, no querer que dos tipos enteros de 32 bits diferentes se preocupen por verificar los rangos al asignar valores entre ellos. Limita el número de índices posibles en un campo de incremento automático comenzando un 0 o 1 a la mitad de lo que sería posible en un tipo sin signo (~ 2e9 en lugar de ~ 4e9) pero esto rara vez es un problema importante (si es probable que necesite una serie de valores clave de esa magnitud probablemente eligió un tipo de 64 bits de todos modos, especialmente si usa una arquitectura de 64 bits donde dichos valores se procesan no menos eficientemente que los de 32 bits), aunque si desea el rango completo y necesita para mantener 32 bits por razones de espacio, puede comenzar el incremento en -2,147,483,647.

David Spillett
fuente
Sí, creo que hemos cubierto ese terreno antes;) tehehe dba.stackexchange.com/questions/983/…
jcolebrand
tinyint no tiene signo (0 .. 255). Por lo general, creo una restricción de verificación en columnas enteras para garantizar que los valores no sean negativos, ya que inevitablemente se escribirá un código que lo asume implícitamente y surgirán errores extraños si de alguna manera se introduce un valor negativo.
Ed Avis