2009-07-09 21 views
12

Estoy trabajando con una antigua base de datos sql server 2000, mezclando parte de su información con una nueva aplicación que estoy construyendo. Noté que algunas de las claves principales en varias de las tablas son flotantes en lugar de cualquier tipo de entradas. No son claves foráneas y son únicas. No puedo pensar en ninguna razón por la que alguien quiera hacer flotantes sus identificadores de clave primaria únicos, pero de ningún modo soy un experto en SQL. Así que supongo que lo que estoy preguntando es si quien diseñó esta base de datos bastante extensa sabe algo que yo no?Sanity Check: ¿Flota como clave principal?

+0

Creo que tus instintos son 100% correctos aquí; las carrozas hacen malas llaves. –

Respuesta

8

Actualmente estoy trabajando con un paquete de contadores bastante grande donde CADA una de 350+ tablas tiene una clave principal de FLOAT (53). Todos los valores reales son enteros y el sistema comprueba estrictamente que sí lo son (hay funciones especiales que hacen todo el trabajo de incremento).

Me sorprendió este diseño, pero puedo entender por qué fue elegido y darle algunos créditos. Por un lado, el sistema es lo suficientemente grande como para tener mil millones de registros en algunas tablas. Por otro lado, esas claves primarias deben ser fácilmente legibles desde aplicaciones externas como Excel o VB6, en cuyo caso realmente no desea convertirlas en BIGINT.

Por lo tanto, el flotador está bien.

+0

Eso es interesante, ¿puedes explicar lo que quieres decir con facilidad de lectura? ¿Quiere decir que es más fácil para las aplicaciones externas leerlas o leerlas por humanos? Gracias por la respuesta. –

+1

No, me refiero a los sistemas con los que las personas escriben sus propias pequeñas aplicaciones de ayuda en torno a lo más importante, pueden ser fácilmente incapaces de hacer frente a los enteros de 64 bits. No hay ningún tipo de datos en VB6 para apoyar de forma nativa un BIGINT, tendría que jugar con Double (como Excel sugiere automáticamente) o Variant-Decimal (como lo hace ADO). ¡Y eso es al menos algo! Puedo imaginar fácilmente un sistema externo que no podrá consumir BIGINT en absoluto. – GSerg

+0

Ah, bien, veo lo que dices, votaciones, gracias. –

2

¿Es un formato NUMÉRICO (x, y) y una IDENTIDAD? Si es así, podría ser una actualización de una versión anterior de SQL Server. La IDENTIDAD de vuelta en el día solo podría ser un formato NUMÉRICO, no el INT común que usamos hoy.

De lo contrario, no hay forma de saber si un flotador es adecuado como clave principal, depende de su dominio. Es un poco más difícil de comparar (IEEE INT es más eficiente que float) y la mayoría de la gente usa cantidades monótonamente crecientes (IDENTIDAD), por lo que los enteros son a menudo lo que la gente realmente quiere.

ya que parece que usted está almacenando enteros:

Para responder a la pregunta original de manera más directa: Si usted está almacenando enteros, utilice el tipo de datos entero. Es más eficiente almacenar y comparar.

+1

En realidad, las PK siempre podían ser INT pero como BIGINT no existía, las personas usaban NUMERICOS – zvolkov

+1

Ah OK. Sé que Sybase SQL Server - hace mucho tiempo - solo soportaba NUMERICS y pensé que el servidor SQL anterior a 6.5 heredó esa restricción –

+0

Creo que usaron SQL Server 2000 desde el principio, aunque no estoy 100% seguro. Aunque voy a hacer una doble verificación. –

6

Los flotadores tienen una propiedad interesante: siempre es posible insertar un valor entre otros dos, excepto en el caso patológico donde se agoten los bits. Tiene la desventaja de que los problemas de representación pueden impedirle hacer referencia a una fila por la clave; es difícil hacer que dos valores de punto flotante sean iguales entre sí.

+2

Como cuestión de principio, si desea estas propiedades, creo que siempre podría agregar una columna indexada que contenga el flotante, además de la clave primaria int. –

+0

Eso fue lo primero que pensé, pero no puedo encontrar ninguno como ese, todos son secuenciales 3.0, 4.0, 5.0, etc. Tal vez esto fue algún tipo de prueba en el futuro, aunque no estoy muy seguro de por qué ya que solo parecen ser identificadores. Gracias por tu contribución. –

+2

No parece que esta sea la respuesta correcta para el caso específico del interrogador ... pero de todas maneras se le vota por tener una respuesta interesante y posible para que la siguiente persona busque esta pregunta. – Beska

8

Trabajé con alguien que usa carrozas como PK en bases de datos de SQL Server. Estaba preocupado por quedarse sin números para los identificadores si se quedaba con las INT. (32 bit en SQL Server.) Simplemente miró el rango de flotación y no pensó en el hecho, no importa que para números más grandes, el lugar de las unidades no se mantenga en el número, debido a la precisión limitada. Entonces su código para tomar MAX (PK) + 1.0 devolvería en algún momento un número igual a MAX (PK). No está bien. Finalmente lo convencí de que no usara float para claves primarias sustitutas para futuras bases de datos. Se retiró antes de arreglar el DB en el que estaba trabajando.

Para responder a su pregunta, "Entonces, supongo que lo que estoy preguntando es si quien diseñó esta base de datos bastante extensa sabe algo que yo no sé". Lo más probable es ¡NO! Al menos no con respecto a la elección de tipos de datos.

+1

El número donde comienza a encontrarse con el problema 'PK + 1.0 = PK' es 9007199254740992. Con 1000000 PK nuevas por segundo, le tomará 285 años encontrar ese número. No creo que este sea un punto que valga la pena preocuparse. Por otro lado, con solo 100 por segundo, puedes quedarte sin espacio en un int. Firmado en menos de un año. –

1

He estado trabajando con la base de datos Cerner Millenium durante algunos años (bajo las cubiertas usa Oracle). Inicialmente, me sorprendió mucho ver que usaba flotadores para ID en las tablas. Luego encontré una ID en nuestra base de datos> 2^32 y una consulta que escribí dio los resultados incorrectos porque la había lanzado incorrectamente a una INT. Me di cuenta por qué lo hicieron.No encuentro ninguno de los argumentos anteriores contra el uso de flotadores persuasivos en el mundo real, donde para las claves solo necesitas números "algo mayores" que 2^32 y el valor de la identificación es siempre de la forma #### ##. 0. (Nadie está hablando de una identificación del formulario ######. ######.) Sin embargo, ahora que estamos importando estos datos en un almacén de SQL Server, y bigint está disponible, vamos a ir con bigint en lugar de flotar.

1

FYI-- hay otra manera de ver esto:

Yo trabajo en el control de procesos en tiempo real y, como tal, la mayoría de mis entradas de fila están basados ​​en el tiempo y se generan automáticamente a altas tasas de no -Máquinas de ASCII. el tiempo, es por eso que mis usuarios suelen buscar y muchos de mis "usuarios" son en realidad máquinas. Por lo tanto, claves primarias basadas en UTC.