martes, 20 de noviembre de 2012
martes, 9 de octubre de 2012
LA RASTERIZACIÓN
es el proceso por el cual una imagen descrita
en un formato gráfico vectorial se convierte en un
conjunto de píxeles o
puntos para ser desplegados en un medio de salida digital,
como una pantalla de computadora,
una impresora electrónica
o una imagen de mapa de bits (bitmap). Este procedimiento se suele usar en momentos muy
concretos:
§
Cuando se trabaja con imágenes de una gran
complejidad (con muchos objetos independientes, muchos rellenos degradados,
muchas capas, etc.) Ahora bien, puesto que al crear un mapa de bits se elimina
toda información de los objetos vectoriales, debe tenerse en cuenta la
posibilidad de efectuar copias de seguridad del archivo vectorial antes de ser
rasterizado, o bien esperar a que la parte de la imagen que se va a rasterizar
sea ya definitiva...
§
Cuando se van a aplicar filtros a la imagen
resultante, cosa que no se efectúa con los objetos iniciales.
El resultado de este método de trabajo
híbrido es un fichero que presenta ciertas partes vectoriales y ciertas partes
bitmap. El fichero puede guardarse sin mayor problema en el formato
correspondiente al programa de ilustración (en algunos casos, se permite que el
mapa de bits no forme parte del archivo, sino que se enlace externamente al
fichero vectorial solamente).
• El sistema
gráfico dibuja estas primitivas transformándolos en pixels ----Rasterización
• Los métodos de
conversión deben ser lo más eficientes posible
• La primitiva
“Punto” es la más sencilla:
– se coloca la
intensidad deseada en la celda de memoria del frame buffer correspondiente
– Cuando el haz de
electrones pase por esa línea horizontal (scan-line), emitirá al pasar por esa
Posición
Dibujo de líneas rectas
• Para dibujar
líneas rectas, habrá que calcular las posiciones intermedias entre los dos
extremos
• Este problema no
existía en las pantallas vectoriales o plotters
• Sin embargo, las
posiciones de los pixels son valores enteros, y los puntos obtenidos de
la ecuación son
reales Æ existe un error (aliasing)
• A menor
resolución, mayor es el efecto
• Es necesario
disponer de métodos para convertir primitivas en pixels de la forma
más eficiente
posible
Rasterización de Circunferencias
Como primera
observación: el círculo tiene simetría central, que se aprovecha utilizando el
{0,0} comocentro y rasterizando solamente un octavo del círculo. ¿Por que un
octavo, y no una porción menor? Porque las simetrías que produce son sólo
cambios de signo e intercambio de coordenadas, que transforman enteros en
enteros; como puede verse en la figura siguiente.
Ecuacion
implicita x2+y2=r2
|
|
Ecuación explicita y =raiz r2-x2
|
|
En los algoritmos se aprovechan las
simetrías
Se
calcula el tramo que va de 90º a 45º, representado en el dibujo mediante un
punto genérico de coordenadas {xi, yi}. Los puntos simétricos se pintan con el
mismo par de enteros intercambiados o cambiados de signo. Al pintar los puntos
hay que trasladarlos del origen al centro real.
Iremos
directamente al método del punto medio con el algoritmo de Bresenham. La curva
es de tendencia horizontal, con x creciente e y decreciente; haremos que x
aumente siempre una unidad. Hay que averiguar si el próximo punto medio está
dentro o fuera de la circunferencia. Si el punto medio está dentro pintamos el
píxel E y si esta fuera pintamos el SE.
Un
punto cualquiera {x, y} está fuera del círculo si x2 + y2 > r2. Habrá que
analizar si el próximo punto medio (en xi +1 e yi −.5, dado que x crece e y
decrece) está o no dentro de la circunferencia:
Clases de algoritmos de iluminación
Raytracing o trazado de rayos
El
algoritmo de trazado de rayos extiende la idea de trazar los rayos para
determinar las superficies visibles con un proceso de sombreado (cálculo de la
intensidad del píxel) que tiene
en cuenta efectos globales de iluminación como pueden ser reflexiones,
refracciones o sombras arrojadas.
Para
simular los efectos de reflexión y refracción se trazan rayos recursivamente desde
el punto de intersección que se está sombreando dependiendo de las
características del material del objeto intersecado.
Para
simular las sombras arrojadas se lanzan rayos desde el punto de intersección
hasta las fuentes de luz.
MÉTODO DE LA CARA POSTERIOR
En
método rápido y sencillo de objeto-espacio para identificar las caras traseras
de un poliedro se basa en las pruebas “interna y externa”. Un punto (x,y,z) está
“adentro” de la superficie de un polígono con los planos A, B, C y D si,
Ax + By + Cz + D
< 0
Cuando
un punto interior está a lo largo de la vista de la superficie, el polígono
debe ser una cara posterior (estamos en el interior de esa cara y no podemos
ver el frente de la misma desde nuestra posición de vista).
Podemos simplificar esta
prueba al considerar el vector normal N, para una superficie de polígono, que
tiene los componentes cartesianos (A, B, C). En general, si V es un
vector en la dirección de vista desde la posición del observador (o de la
“cámara”), entonces este polígono es una cara posterior si,
V . N > 0
Además, si se han convertido las
descripciones del objeto a coordenadas de proyección y nuestra dirección de
vista es paralela al eje de vista de Zv, entonces V = (0, 0, Vz)
y
V . N = Vz
C
de modo que sólo debemos de considerar el
signo de C, el componente de z del vector normal N.
En un sistema de vista de lado derecho, con
dirección de vista a lo largo del eje negativo de Zv, el polígono es
una cara posterior si C = 0, dado que nuestra posición de vista toca ese
polígono. Por tanto, en general, podemos designar cualquier polígono como una
cara posterior si su vector normal tiene un valor del componente de z:
C <= 0
MÉTODO DEL Z BUFFER (O MÉTODO DEL BUFFER
CON PROFUNDIDAD)
Un planteamiento de imagen-espacio que se
utiliza en forma común para detectar superficies visibles es el método de
buffer con profundidad, que compara las profundidades de las superficies en
cada posición de píxel en el plano de proyección. Este procedimiento se conoce
también como el método de buffer z, ya que por lo regular, la
profundidad del objeto se mide desde el plano de visión a lo largo del eje de
las z de un sistema de vista. Cada superficie de una escena se procesa
por separado, un punto a la vez a lo largo de la superficie. Por lo general el
método se aplica en escenas que sólo contienen superficies de polígono porque
los valores de profundidad se pueden calcular con gran rapidez y es fácil
implementar el método. No obstante, el método se puede aplicar a superficies no
planas.
Cuando se convierten las descripciones de
los objetos a coordenadas de una proyección, cada posición (x, y, z) en
una superficie de polígono corresponde al punto de proyección ortogonal (x,
y) en el plano de visión. Por tanto, para cada posición del píxel (x, y)
en el plano de visión, se pueden comparar las profundidades del objeto al
comparar los valores de z.
Podemos implementar el algoritmo del z
buffer en coordenadas normalizadas, de manera que los valores de z van de 0 en
el plano de recorte posterior a zmax en el plano de recorte frontal.
Se puede establecer el valor de zmax
sea como 1 (para un cubo unitario) o como el valor mas alto que
sea posible almacenar en el sistema.
Como lo implica el nombre de este método,
se requieren dos áreas del buffer. Se utiliza un buffer con profundidad para
almacenar los valores de profundidad para cada posición de (x, y) conforme
se procesan las superficies y el buffer de enfriamiento almacena los valores de
intensidad para cada posición. Al principio, todas las posiciones en el buffer
con profundidad se establecen como 0 (profundidad mínima) y se inicializa el
buffer de enfriamiento a la intensidad del fondo. De este modo se procesa cada
superficie que se lista en la tabla de polígonos, una linea a la vez, al
calcular la profundidad (valor de z) en cada posición de píxel (x, y).
La profundidad calculada se compara con el valor almacenado en forma previa en
el buffer con profundidad de esa posición. Si la profundidad que se calcula es
mayor que el valor que se almacena en el buffer con profundidad, se almacena el
nuevo valor y se determina la intensidad de la superficie en esa posición y se
sitúa en la misma posición de xy en el buffer de enfriamiento.
MÉTODO DE LÍNEA DE RASTREO (SCAN-LINE
METHOD)
Este método de imagen-espacio para
eliminar superficies ocultas es una extensión del algoritmo de línea de rastreo
para llenar interiores de polígonos. En lugar de llenar sólo una superficie,
ahora manejamos superficies múltiples. Conforme se procesa cada línea de
rastreo, se analizan todas las superficies de polígono que intersectan esas esa
línea para determinar cuáles son visibles. A lo largo de cada línea de rastreo,
se realizan los cálculos de profundidad para cada superficie que se traslapa a
fin de determinar cuál está mas cerca del plano de visión. Cuando se determina
la superficie visible, se captura el valor de intensidad para esa posición en
el buffer de enfriamiento.
Para ello suponemos que se
establecen tablas para las diversas superficies, las cuales incluyen tanto una
tabla de arista como una tabla de polígono. La tabla de aristas contiene los
extremos de las coordenadas para cada línea de la escena, la pendiente inversa
de cada línea y apuntadores en la tabla de polígono para identificar las
superficies que se limitan por cada línea. La tabla de polígono contiene los
coeficientes de la ecuación del plano para cada superficie, información de
intensidad para las superficies y, quizá, apuntadores a la tabla de aristas.
Para facilitar la búsqueda de superficie que intersectan a una línea de rastreo
determinada, podemos establecer una lista activa de aristas con base en la
información de la tabla de aristas. Esta lista activa contendrá solo aristas
que cruzan la línea de rastreo actual, clasificadas en orden creciente de x.
Además, definimos una bandera para cada superficie que se establece como activa
o inactiva para indicar si una posición a lo largo de una línea de rastreo está
adentro o afuera de la superficie. Las líneas de rastreo se procesan de
izquierda a derecha. En la frontera del extremo izquierdo de una superficie, se
activa la bandera de la superficie y en la frontera del extremo derecho, ésta
se desactiva.
La figura muestra el método de línea de rastreo para
localizar las porciones visibles de las superficies para las posiciones de
píxel a lo largo de la linea. La lista activa para la línea de rastreo 1
contiene información de la tabla de aristas para las aristas AB, BC, EH y FG.
Para las posiciones a lo largo de esta línea de rastreo entre las aristas AB y
BC, sólo se activa la bandera para la superficie S1. Por tanto, no
se requieren cálculos de profundidad y la información de intensidad para la
superficie S1 se captura a partir de la tabla de polígono en el
búfer de enfriamiento. De modo similar, entre las aristas EH y FG, sólo se
activa la bandera para la superficie S2 . No hay mas posiciones a lo
largo de la línea de rastreo 1 que intersecten superficies, de manera que los
valores de intesidad de las otras áreas se establecen como la intensidad del
fondo. Se pueden cargar la intensidad del fondo a través del buffer en una
rutina de inicialización.
Podemos aprovechar la coherencia a
lo largo de las línea de rastreo conforme pasamos de una línea de rastreo a la
siguiente. Es posible acceder cualquier número de superficies de polígono que
se traslapan con este método. Las banderas de las superficies se establecen
para indicar si una posición está adentro o afuera y se llevan a cabo los
cálculos de profundidad cuando hay superficies que se superponen. Cuando se
emplean estos métodos de coherencia, es necesario tener precaución para rastrar
qué sección de la superficie es visible en cada línea de rastreo. Este
planteamiento funciona sólo si las superficies no se intersectan o se traslapan
en forma cíclica entre sí. Si en una escena se tiene cualquier clase de
superposición cíclica, podemos dividir las superficies para eliminar las
superposiciones. Las líneas de rayas en esta figura dónde se podrían subdividir
los planos, de modo que se eliminen las superposiciones cíclicas.
Algoritmos de sombreado
ALGORITMO DE GOURAUD
El algoritmo de Gouraud se basa en
calcular los vector normales en un vértice común a varias caras y realizar el
promedio entre ellos, interpolando luego los colores por la cara. Veamos que se
quiere decir con esto:
Supongamos que tenemos una cara de
tres lados, A, B y C. Esos vértices pertenecen no solo a
esa cara, sino también a las caras que estén en contacto con la primera. Al
usar los algoritmos de iluminación, veíamos cada uno de esos vértices como tres
(o más, depende del número de caras en contacto) vértices distintos, cada uno
con su nivel de luz correspondiente. Esto es correcto en objetos con caras,
pero no es un efecto deseable en una figura de revolución, pues se supone que
es un solo punto. Entonces, si suponemos que el punto A pertenece a las
caras a, b y c, lo que haremos será hallar los tres vectores normales
en A respecto de a, b y c. Esos tres vectores los
promediamos (con la media aritmetica), y nos dará el vector normal que habría
en ese punto si la figura fuese realmente de revolución, y no una aproximación
hecha con superficies planas.
Una vez que hemos calculado los
vectores normales teóricos en cada punto, hallamos la iluminación de estos.
Esto nos da que en la cara que teníamos, el punto A tiene un nivel de luz, el B
otro y el C otro más, los cuales no tienen por qué ser iguales. ¿Cómo
podemos pintar la cara, si tenemos tres niveles distintos? La solución consiste
en interpolar los colores: si en A tiene un valor y en B tiene
otro, en el punto medio de ambos tendrá la media.
Se puede hacer una simplificación,
pues es fácil demostrar que el nivel de iluminación del punto calculado con la
media de los tres vectores normales es igual a la media de los niveles de
iluminación calculados con cada uno de los vectores normales. De esta forma,
calcularemos la iluminación del punto con respecto a cada cara y hallaremos su
media.
Para ahorrar tiempo de ejecución,
podemos calcular primero la iluminación de cada punto (la media) y almacenarla
en una tabla. Así no hará falta calcularlo repetidas veces, una por cada cara
que comparta el vértice.
Pero, ¿cómo interpolamos los
colores? Es fácil. Supongamos que tenemos una cara triangular, formada por los
puntos A=(X0,Y0), B=(X1,Y1) y C=(X2,Y2). El nivel de luz en cada punto
será La, Lb y Lc respectivamente. Sabemos que la ecuación
de la recta que usamos es:
X = X0 + a*(X1-X0) Y = Y0 +
a*(Y1-Y0)
siendo 'a' un valor entre 0 y 1.
Pues bien, esta ecuación lo que hace es promediar los puntos situados entre X1
y X0 (o Y1 e Y0 en la otra), por lo que podemos usarla para hacer el promedio
de los colores. El problema es que esto solo nos traza una línea. ¿Cómo podemos
hacer para rellenar la figura completa?
La solución es simple: consideramos
la línea que une los puntos A y B. Sería:
(X,Y) = A + a*(B-A)
En el punto (X,Y) (un punto
cualquiera de la recta AB), el nivel de luz será L(x,y) = La + a*(Lb-La)
(un detalle importante: el valor de 'a' es el mismo para todas las ecuaciones).
Ahora sólo tenemos que repetir el proceso para cada punto de la recta que une C
y (X,Y). De este modo, lo que hacemos es calcular un punto de la recta
AB (el punto (X,Y) y promediar entre él y C; calcular el siguiente punto de la
recta AB y promediar entre él y C. Y así hasta acabar con la recta AB.
ALGORITMO
DE PHONG PARA ILUMINACIÓN Y REFRACCIÓN
El método pong para iluminación local
fue desarrollado por Bui Tuong Phong y puede producir cierto grado de realimo
en objetos tridimensionales combinando tres elementos: luz disfusa, especular y
ambiental para cada punto en una superficie. Emplea muchas suposiciones, como
por ejemplo que todas las luces son puntos, solouna superficie geométrica es
considerada, solo modelos locales de disfusa y especular. Colores especulares
son los mismos que los colores de luz y el ambiente es constante y global.
Disfuso:
Id
= Ii kd cosθ
donde Ii es el brillo de la fuente de luz
puntual. θ es el ángulo entre la superficie normal y la dirección de fuente de
luz. kd
Para
múltiples luces:
Donde L y N son vectores unitarios,
L_n es el director director de la superficie a la n-ava fuente de luz.
Luz especular (luz alta)
Donde n
indica la refractividad de la superficie. Infinito significará un espejo
perfecto. Omega es el ángulo entre el espejo y el visor. R es la dirección de
la luz especular y V es el actual vector. Este fallo produce la radiosidad, un
fallo en Phong.
Combinando
luces disfusas y especular es suficiente para la exactitud local. Para imitar
las condiciones globales un elemento llamado “ambiente” debe ser añadido para
proveer iluminación general, usualmente como un valor constante.
Ig
= Iaka
Combinando los tres, obtenemos
Asumiendo la
no reducción de la intensidad de luz con la distancia, la cual puede ser
añadida si se desea.
Este es un
modelo empírico, el cual no está basado en física, pero tiene una observación
física. Phong observó que para cada pequeña superficie brillante la luz
especular fue pequeña y la intensidad decae rápidamente, mientras que para
superficies mas romas fue mas larga y decayó mas lentamente.
B spline
Bezier
lunes, 14 de mayo de 2012
lunes, 7 de mayo de 2012
Creación de bases de datos
¿Qué es una tabla?
Como por ejemplo
en Word, una tabla es una lista de datos, organizados por columnas y filas. Por
ejemplo, la siguiente tabla muestra unas películas dentro de una lista.
imagen 1.
Dentro de un
sistema gestor de bases de datos, la información se puede organizar dentro de
tablas, en las que solo tendremos que decidir qué columnas queremos que tenga y
de que tipo va a ser la información que tendrán (Numérico, texto, etc)
Creando una
base de datos
El nombre de
nuestra base de datos será Videoteca. Se abrirá una ventana, donde abajo del todo veremos “Crear
una base de datos”, en ella escribiremos el nombre de nuestra nueva base de
datos, en este caso: Videoteca.
imagen 2
PD: en lo nombres
no podemos escribir caracteres como, comas, acentos, ñ, etc.
Si todo ha ido
bien, ahora nos pondrá que ya esta creada.
imagen 3
Crear
tablas y campos para la base de datos
En el apartado
anterior hemos aprendido a crear una base de datos MySQL, y he creado una, a la
cual la he llamado “Videoteca”. Ahora el siguiente paso seria crear las tablas
y los campos que nos hagan falta para posteriormente meter los datos.
Creando una
Tabla y sus campos en MySQL
Existen varias
formas y programas diferentes para crear una tabla en una base de datos MySQL, como
phpMyAdmin, el motivo de hacerlo desde
phpMyAdmin y no de otra forma es porque comúnmente, en todos los servidores ya
sean caseros o de un hosting privados siempre suele tener un phpMyAdmin a mano.
En primer lugar
vamos a nuestro phpMyAdmin y seleccionamos la base de datos que hemos creado anteriormente
(Videoteca) como vemos en la siguiente imagen:
imagen 4
Ahora se cargara
la base de datos y nos saldrá un mensaje que pone “no se han encontrado tablas
en la base de datos” y más abajo veremos un pequeño formulario para crear
nuestra primera tabla.
En nombre
pondremos película y en número de campos pondremos 3.
imagen 5
Ahora damos a
continuar y se nos cargara la pagina para crear los campos, en este caso serán
los 3 que hemos puesto antes.
Veremos que
tendremos que rellenar varios datos, pero no tenemos que preocuparnos, ya que
explicaremos uno a uno lo que significa.
·
En Campo,
pondremos el nombre del campo.
·
En Tipo,
debemos poner el tipo de datos que se van a incluir en el campo, por ejemplo
pondríamos:
o
VARCHAR si vamos a incluir un texto inferior a 255
caracteres ejemplo (nombres, DNI, direcciones).
o
TEXT si vamos a incluir un texto más largo de 255
caracteres ejemplo (noticias).
o
INT si deseamos escribir exclusivamente números.
o
DATE para poner fechas, o DATETIME, si
queremos poner hora y fecha.
·
En Longitud,
deberemos de poner el número de caracteres máximo que puede contener dicho
campo, esto no hace falta para todos los tipos de datos, ya que por ejemplo
para los de tipo DATE, o TEXT no hace falta, pero para los INT y VARCHAR es
imprescindible.
·
En Nulo,
podemos elegir Null o Not Null dependiendo si queremos que el campo pueda estar
vacío (sin datos) o no.
·
En predeterminado,
podemos poner lo que queramos que se ponga en el campo en el caso de que no se
rellenen los datos o que se rellene de forma incorrecta.
·
En extra,
vemos que podemos seleccionar Auto_Increment, esto nos sirve para llevar un
orden de los datos que tenemos, por ejemplo, creamos un campo llamado id, de
tipo INT y le ponemos auto_increment, de esta forma cada vez que se cree un
nuevo dato en este campo se le sumara 1 a la id anterior, de forma que podremos
llevar un pequeño orden.
Debemos de poner
en cada uno de los 3 campos:
Campo 1
Nombre: id_pelicula
Tipo: INT
Nulo: Not Null
Extra: Auto_increment
Y marcamos la llave de Primaria![Descripción: http://www.cristalab.com/images/tips/php/crear-mysql/crear-mysql07.png](file:///C:/Users/PERSONAL/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png)
Nombre: id_pelicula
Tipo: INT
Nulo: Not Null
Extra: Auto_increment
Y marcamos la llave de Primaria
![Descripción: http://www.cristalab.com/images/tips/php/crear-mysql/crear-mysql07.png](file:///C:/Users/PERSONAL/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png)
Campo 2
Nombre: pelicula
Tipo: VARCHAR
Longitud: 30
Nulo: Not Null
Nombre: pelicula
Tipo: VARCHAR
Longitud: 30
Nulo: Not Null
Campo 3
Nombre: Director
Tipo: VARCHAR
Longitud: 30
Nulo: Not Null
Nombre: Director
Tipo: VARCHAR
Longitud: 30
Nulo: Not Null
Índice
Un índice (o KEY,
o INDEX) es un grupo de datos que MySQL asocia con una o varias columnas de la
tabla. En este grupo de datos aparece la relación entre el contenido y el
número de fila donde está ubicado.
Los índices -como
los índices de los libros- sirven para agilizar las consultas a las tablas,
evitando que mysql tenga que revisar todos los datos disponibles para devolver
el resultado.
Creación de índices
Podemos crear el
índice a la vez que creamos la tabla, usando la palabra INDEX seguida del nombre del índice a crear y columnas a indexar (que
pueden ser varias):
INDEX nombre_indice (columna_indexada, columna_indexada2...)
La sintaxis es ligeramente distinta segun la clase de índice:
INDEX nombre_indice (columna_indexada, columna_indexada2...)
La sintaxis es ligeramente distinta segun la clase de índice:
PRIMARY KEY (nombre_columna_1
[,nombre_columna2...]) UNIQUE INDEX nombre_indice (columna_indexada1
[,columna_indexada2 ...]) INDEX nombre_index (columna_indexada1
[,columna_indexada2...])
Podemos también
añadirlos a una tabla después de creada:
ALTER TABLE nombre_tabla ADD INDEX nombre_indice (columna_indexada);
ALTER TABLE nombre_tabla ADD INDEX nombre_indice (columna_indexada);
Si queremos
eliminar un índice: ALTER TABLE tabla_nombre DROP INDEX nombre_indice¿para
que sirven ?
LOs index permiten
mayor rápidez en la ejecución de las consultas a la base de datos tipo SELECT
... WHERE
La regla básica es
pues crear tus índices sobre aquellas columnas que vayas a usar con una
cláusula WHERE, y no crearlos con aquellas columnas que vayan a ser objeto de
un SELECT: SELECT texto from tabla_libros WHERE autor = Vazquez; En
este ejemplo, la de autor es una columna buena candidata a un indice; la de
texto, no.
Otra regla básica es que son mejores candidatas a indexar aquellas columnas que presentan muchos valores distintos, mientras que no son buenas candidatas las que tienen muchos valores idénticos, como por ejemplo sexo (masculino y femenino) porque cada consulta implicará siempre recorrer prácticamente la mitad del índice.
Otra regla básica es que son mejores candidatas a indexar aquellas columnas que presentan muchos valores distintos, mientras que no son buenas candidatas las que tienen muchos valores idénticos, como por ejemplo sexo (masculino y femenino) porque cada consulta implicará siempre recorrer prácticamente la mitad del índice.
MyISAM
Es la
tecnología de almacenamiento de datos usada por defecto por el sistema
administrador de bases de datos relacionales MySQL. Este tipo de tablas
están basadas en el formato ISAM pero con nuevas extensiones. En las
últimas versiones de MySQL, el motor InnoDB está empezando a
reemplazar a este tipo de tablas por su capacidad de ejecutar transacciones de tipo ACID y
bloqueo de registros e integridad referencial.
Cada tabla
de tipo MyISAM se guarda en tres archivos. Los archivos tienen el nombre de la
tabla y una extensión que indica el tipo de archivo,
§
.frm almacena la
definición de la tabla
§
.MYD (MyData)
contiene los registros de la tabla
§
.MYI (MyIndex)
contiene los índices de la tabla
Para:
especificar que deseas usar el tipo de tablas MyISAM, se indica con la opción ENGINE al crear la tabla o modificarla, por ejemplo
CREATE TABLE t (i INT) ENGINE = MYISAM;
La principal
característica de este tipo de almacenamiento es la gran velocidad que obtiene
en las consultas, ya que no tiene que hacer comprobaciones de la integridad
referencial, ni bloquear las tablas para realizar las operaciones por la
ausencia de características de atomicidad. Este tipo de tablas está
especialmente indicado para sistemas que no tienen un número elevado de
inserciones como pueden ser las páginas web.
Creación de tablas
Muchas son las
opciones que se ofrecen al generar tablas. No vamos a tratarlas detalladamente
pues sale de lo estrictamente práctico. Tan sólo mostraremos algunos de los
tipos de campos que pueden ser empleados en la creación de tablas con sus
características:
Tipo
|
Bytes
|
Descripción
|
INT o INTEGER
|
4
|
Números enteros. Existen
otros tipos de mayor o menor longitud específicos de cada base de datos.
|
DOUBLE o REAL
|
8
|
Números reales (grandes y
con decimales). Permiten almacenar todo tipo de número no entero.
|
CHAR
|
1/caracter
|
Alfanuméricos de longitud
fija predefinida
|
VARCHAR
|
1/caracter+1
|
Alfanuméricos de longitud
variable
|
DATE
|
3
|
Fechas, existen multiples
formatos específicos de cada base de datos
|
BLOB
|
1/caracter+2
|
Grandes textos no indexables
|
BIT o BOOLEAN
|
1
|
Almacenan un bit de
información (verdadero o falso)
|
Las tablas InnoDB
Creación de una
tabla InnoDB
La creación
de tablas de este tipo no presenta ninguna dificultad añadida. El proceso es
idéntico a las tablas habituales sin más que añadir Type=InnoDB después
de cerrar el paréntesis de la sentencia de creación de la tabla.
Este script crea una tabla InnoDB con
idénticos campos a los utilizados en el caso de la tabla MyISAM que hemos visto en páginas anteriores. La
sintaxis, muy similar a la utilizada allí es esta:
<?php
#definimos (en minusculas) el nombre de la
nueva tabla
$tabla="demoinno";
# escribimos la cadena que contiene la
sentencia de creación de la nueva tabla
$crear="CREATE TABLE $tabla (";
$crear.="Contador TINYINT(8) UNSIGNED ZEROFILL NOT NULL
AUTO_INCREMENT,";
$crear.="DNI CHAR(8) NOT NULL, ";
$crear.="Nombre VARCHAR (20) NOT NULL, ";
$crear.="Apellido1 VARCHAR (15) not null, ";
$crear.="Apellido2 VARCHAR (15) not null, ";
$crear.="Nacimiento DATE DEFAULT
'1970-12-21', ";
$crear.="Hora TIME DEFAULT '00:00:00',
";
$crear.="Sexo Enum('M','F') DEFAULT 'M'
not null, ";
$crear.="Fumador CHAR(0) , ";
$crear.="Idiomas SET(' Castellano','
Francés','Inglés',
' Alemán',' Búlgaro',' Chino'), ";
$crear.=" PRIMARY KEY(DNI), ";
$crear.=" UNIQUE auto (Contador)";
$crear.=")";
# esta es la única diferencia con el proceso
de
# creación de tablas MyISAM
$crear.=" Type=InnoDB";
/* tenemos completa la sentencia MYSQL solo falta ejecutarla crear la conexión y
ejecutarla */
/*incluimos los parámetros de conexión */
include('mysqli.inc.php');
/* incluimos dos opciones de proceso y de
programacion orientada a objetos. Podemos ejecutar
los ejemplos pasado mediante el metodo GET el
tipo elegido. */
if(!empty
($_GET['tipo'])){
$tipo_script=$_GET['tipo'];
}else{
$tipo_script="objetos";
}
/*En caso de tipo proceso utilizaríamos esto
*/
if ($tipo_script=="proceso"){
/****** Programación mediante
procesos ***********/
#conexion,
selección de base de datos y verificacion de errores segun ejemplos anteriores
$conexion=@mysqli_connect
($cfg_servidor,$cfg_usuario,$cfg_password,$cfg_basephp1);
if(!mysqli_connect_errno()==0){
print "<Mbr>No ha podido realizarse la conexión mediante
procesos<br>";
print "Error número: ". mysqli_connect_errno()."
equivalente a: ". mysqli_connect_error();
exit();
}
#
Creación. Los parámetros requieren el orden aquí indicado al revés del caso
mysql
if(mysqli_query($conexion,$crear)){
print "La tabla ha sido CREADA";
}else{
print "<br>No ha podido crearse la base de datos mediante
procesos<br>";
print "Error : ". mysqli_error($conexion);
exit();
}
mysqli_close($conexion);
}
/* en caso de programacion orientada a
objetos */
if ($tipo_script=="objetos"){
#conexion, selección de base de datos y verificacion de errores segun
ejemplos anteriores
$objeto=@new
mysqli ($cfg_servidor,$cfg_usuario,$cfg_password,$cfg_basephp1);
if(!$objeto->connect_errno==0){
print "
No ha podido realizarse la conexión mediante objetos<br>";
No ha podido realizarse la conexión mediante objetos<br>";
print "Error número: ". $objeto->connect_errno."
equivalente a: ". $objeto->connect_error;
exit();
}
if($objeto->query($crear)){
print "La tabla ha sido CREADA";
}else{
print "<br>No ha podido
crearse la tabla mediante objetos<br>";
print "Error : ". $objeto->error;
exit();
}
$objeto->close();
}
?>
Suscribirse a:
Entradas (Atom)