2010-12-10 17 views
5

Necesito tener ID de texto en mi aplicación. Por ejemplo, tenemos el juego de caracteres aceptable azAZ09, y el rango permitido de ID [aaa] - [cZ9]. La primera identificación generada sería aaa, luego aab, aac, aad e.t.c.MySQL: incremento de ID de texto en DB

¿Cómo se puede devolver la ID & incrementar el límite inferior en la forma de transacción? (Siempre que hay cientos de solicitudes simultáneas y todos deben tener resultado correcto)

Para reducir la carga que supongo que es posible definir dicen 20 gamas diferentes, e id volver de rango al azar - esto debería reducir la contención, pero no es claro cómo hacer una sola operación en primer lugar.

Además, tenga en cuenta que el número de ID en el rango podría superar los 2^32.

Otra idea es tener rangos de enteros de 64 bits y convertir enterger-> char id en el código de software, donde podría hacerse de forma asíncrona.

¿Alguna idea?

+0

¿No puedes simplemente usar el tipo entero y convertirlo cuando sea necesario? – PeeHaa

+0

Sí puedo. Esto todavía no resuelve la tarea, todavía necesito el soporte de rangos permitidos, lo que significa que la autoincrementación habitual no funcionará. – BarsMonster

Respuesta

1

me gustaría hacer una pregunta diferente para hacer el mismo problema más fácil de resolver: ¿cómo puedo usar las características de m y base de datos para implementar mi requerimiento.

Mira lo que ofrece tu base de datos en términos de gestión de las secuencias. Algunos de ellos pueden manejar algo como esto. Si tu base de datos no lo hace, miraría "piggy backing" en sus teclas numéricas normales, ya que ya resuelven todos los problemas que estás anticipando.

Lo que quiero decir es esto: deje que la base de datos distribuya las teclas numéricas como lo hace normalmente, comenzando en 0. Luego escriba dos funciones para convertir esos números y sus claves de texto. Aquí tiene cierta flexibilidad: puede implementar esta función en la base de datos (utilizando una segunda columna, activadores o alguna característica de base de datos interesante) o en su capa de servidor, como Java. No será tan complicado. Al final, son todos los bits de todos modos ... la tecla de texto es solo una forma diferente de cortar los bits.

Buena suerte!

+0

Brillante idea inicial, y requiere solo 1 tabla, ahora veo la solución perfecta :-) – BarsMonster

2

Una solución basada en long números (BIGINT), con caracteres-a-número y conversiones serie-a-caracteres realiza en el software, que tienen - por ejemplo - rangos de 32 diferentes,

  • creación de 32 mesas rango0 .. rango31 para bajar la carga (una tabla única con 32 campos de rango tendría su fila bloqueada cada vez que se escribe un rango)

  • comenzando los rangos configurando auto_increment a un valor muy alto en 64 bits - tal vez 63 si desea evitar el problema de signo en su aplicación. Idealmente, el valor de rango en 5 bits, de 0 a 31. 1 signo de bit + rango de 5 bits = 6 bits. Su contador será de 1 a (2^58-1) o 10^17 ... eso debería ser suficiente.

  • en el software se selecciona al azar el número de serie, y la consulta de nombres tabla se construye en consecuencia range i, donde i va de 0 a 31.

La comandos crean tablas serían algo como, por ejemplo en Java

String table; 
    String query; 
    long increment; 

    for (long i=0 ; i<32 ; i++) { 
    table = "range"+i; 
    increment = (i<<58) + 1; 
    query = "CREATE TABLE "+table+" (v bigint auto_increment primary key) auto_increment="+increment; 

    do_query(query); 
    } 
+0

Hmm ... Interesante, pero ¿cómo manejaré rangos que digamos 100 números? – BarsMonster

+0

@BarsMonster En lugar de 32, eso sería 128, 2^7 (0..127), '(i << 58)' sería '(i << 56)' (todavía alrededor de 10^16 valores posibles). –

+0

Por supuesto, podría usar solo una tabla ... (reemplace 'i <32' con' i <1' :-) - la idea detrás de la complejidad de 2^x auto_increment era reducir los accesos simultáneos al mismo auto tabla incrementada, y por lo tanto la frecuencia * bloqueos *. De esta forma, tenía claves que son múltiples, aunque únicas. –

Cuestiones relacionadas