2010-03-22 16 views
15

SQLite3 usa tipado dinámico en lugar de tipeo estático, en contraste con otros sabores de SQL. El SQLite website lee:Tipificación dinámica de SQLite3

mayoría de los motores de bases de datos SQL (todos los motores de base de datos SQL que no sea SQLite, por lo que sabemos) utiliza tipos estáticos, rígidos. Con el tipado estático, el tipo de datos de un valor viene determinado por su contenedor: la columna particular en la que se almacena el valor.

SQLite utiliza un sistema de tipo dinámico más general. En SQLite, el tipo de datos de un valor está asociado con el valor en sí mismo, no con su contenedor.

Me parece que esto es exactamente lo que hace no quieren, ya que le permite almacenar, por ejemplo, cadenas en columnas de tipo entero.

La página sigue:

... el tipado dinámico en SQLite le permite hacer cosas que no son posibles en las bases de datos tradicionales rígidamente mecanografiadas.

Tengo dos preguntas:

  1. el caso de uso pregunta: ¿Cuáles son algunos ejemplos en los tipos dinámicos de SQLite3 es beneficioso?
  2. La pregunta histórica/de diseño: ¿Cuál fue la motivación para implementar SQLite con el tipado dinámico?
+1

Mi observación es que sqlite3 depende más del software que lo integre como más inteligente, por ejemplo, de que no almacene enteros en columnas de cadenas, en lugar de proporcionar estructura por sí mismo. – avpx

+0

Este es el tipo de pregunta de discusión que a menudo es mejor como Community Wiki, pero es, en general, una pregunta pobre para el formato de SO. Intente hacer * una * pregunta por ... pregunta, y es preferible ser específico en lugar de abierto. http://stackoverflow.com/faq –

Respuesta

9

Esto se llama type affinity en SQLite.

Según el sitio web SQLite, lo han hecho "para maximizar la compatibilidad entre SQLite y otros motores de base de datos". (vea el enlace de arriba)

SQLite soporta el concepto de "afinidad de tipos" en las columnas. La afinidad de tipo de una columna es el tipo recomendado para los datos almacenados en esa columna. La idea importante aquí es que el tipo es recomendado, no obligatorio. Cualquier columna puede almacenar cualquier tipo de datos. Es solo que algunas columnas, dada la opción, preferirán usar una clase de almacenamiento sobre otra. La clase de almacenamiento preferida para una columna se llama su "afinidad".

Según tengo entendido, SQLite es exactamente como se llama: un motor de base de datos muy ligero y minimalista. La sobrecarga asociada con el tipado fuerte probablemente esté más allá del alcance del proyecto, y es mejor dejarlo a la aplicación que usa SQLite.

Pero de nuevo, según su sitio web, lo han hecho para maximizar la compatibilidad con otros motores de DB.

+0

> Esto se llama afinidad de tipo en SQLite. "Afinidad de tipo" es un aspecto específico de la tipificación dinámica de sqlite --- las columnas tienen un tipo recomendado, pero los valores reales son libres de ser de otros tipos. > De acuerdo con el sitio web SQLite, lo han hecho "para maximizar la compatibilidad entre SQLite y otros motores de base de datos". Sí, dicen eso, pero se trata de la afinidad de tipo, no la tipada dinámica en general. –

+5

En cuanto a la "sobrecarga asociada con el tipado fuerte": Suponiendo que de hecho signifique "tipado estático": imagino que el uso de tipeo estático permitiría una implementación más eficiente que la tipada dinámica. Por ejemplo, el almacenamiento puede ser más compacto y se pueden evitar muchas comprobaciones de tipo al realizar consultas. –

+0

Pido disculpas por el formateo de los comentarios anteriores: pensé que se permitía el descuento. Soy nuevo aqui. –

4

Si nos fijamos en, digamos, la página "about: config" de Firefox, creo que estas configuraciones están realmente almacenadas en una base de datos SQlite (aunque no estoy 100% seguro). El beneficio de usar el tipado dinámico de SQlite es que cada valor en la configuración puede ser de tipo fuerte (por ejemplo, la configuración "alerts.totalOpenTime" es un número entero, mientras que "app.update.channel" es una cadena) sin tener que tener uno separado columna por tipo.

Básicamente es el mismo argumento que para los lenguajes de programación, al final: ¿por qué tener tipeado dinámico en un lenguaje de programación sobre tipado estático?