2011-08-25 24 views
5

Necesito usar una columna de texto como clave principal para mi base de datos sqlite. También tengo la posibilidad de usar una función hash para obtener un int de 32 bits/64 bits de mis valores de texto (quiero usar como clave principal). Así que podría usar estos valores int hash en lugar de mi valor de texto como claves principales. Pero luego necesito almacenar el valor de texto sin procesar adicionalmente en la tabla.sqlite: ¿Debo usar una columna de texto como clave principal, o convertirla mediante una función hash?

Pero he leído que sqlite está usando un rowid internamente, así que no sé si usar una función hash ayudará de todos modos.

¿Se almacenará sqlite el rowid o el valor del texto (cuando lo uso en lugar del valor hash) en sus páginas? Cuando almacena el valor del texto, creo que podría volar las páginas y usar un valor de hash sería mejor.

Pero tengo una falta de conocimiento aquí. Espero que me puedas ayudar.

+0

¿Por qué necesita/quiere usar una columna de texto como clave * primaria *? – Tim

+0

@Tim, porque esa es la clave que obtengo de los datos. Es una cadena de unos 30 caracteres de largo. – Chris

+0

si fuera a hacer referencia a esa tabla de otra u otras, iría con un entero autoincrementing como PK, y un índice en el campo de texto largo: 'select id, longtextvalue from T where longtextvalue =?'. – Tim

Respuesta

1

Lamentablemente sí, los índices de cadenas (incluido el uso como clave principal) ocupan el doble de espacio. Una vez para el valor en la fila, segunda vez para el valor en el índice.

Así que si hash satisface sus necesidades (no necesita clasificación, búsqueda por rangos), usarlo será una buena idea.

1

Si se supone que los valores en la columna de texto son únicos, de todos modos tendrá que poner un índice único en esa columna.

La pregunta real no tiene que ver con las claves principales, sino con las referencias de las claves externas. Si una tabla tiene una columna de enteros únicos y una columna de texto único, puede usar cualquiera como destino para una referencia de clave externa. Todas las referencias de clave externa al entero requerirán una unión; algunas referencias de clave externa al texto no requerirán una unión. (Debido a que la información crucial se transporta en la clave en sí. Solo aquellas consultas que necesiten más columnas además de la clave de texto necesitarán una unión.)

Cuestiones relacionadas