Bases de datos (BD (BD)) Una BD es un archivo donde se “anotan” o “registran” otros archivos, como tablas e índices.
También contiene información adicional sobre los campos de las tablas. Guardan otra información, que iremos viendo de a poco. Cuando se “registra” una tabla en una BD, la tabla deja de ser libre y se convierte en tabla base. Este cambio de tipo permite agregar información adicional a la tabla, que se guarda en la BD. Por ejemplo, reglas y mensajes de validación de campos y de registros, títulos de campos, formatos de campos y valores predeterminados de campos.
Una BD es, en realidad, una tabla con extensión DB DBC C. Tiene campos predefinidos predefi nidos por po r VFP. VFP.
Para agregar una tabla a una BD, la tabla debe ser libre.
Una tabla no puede pertenecer a más de una BD.
Si una tabla pertenece a BD1 y queremos que pertenezca pertenezca a BD2:
Primero tenemos que quitarla de BD1 para convertirla en libre.
Después debemos agregarla a BD2.
Cuidado . Cuando quitamos una tabla de una BD, puede perder mucha información adicional que está en la BD. Esta información puede referirse a la misma tabla o ser una información referida a la relación de esa tabla con otra tabla.
Tablas Una tabla es un archivo cuyo nombre inventa el usuario y cuya extensión es DB DBF F. Una tabla está formada por registros . Cada registro está formado por campos . Tabla Registro Campo
Campo
Registro Campo
Campo
Campo
Registro Campo
Campo
Campo
Campo
Registros Todos los registros tienen igual longitud. Registro
Registro
Registro
Registro
y así …
Cada registro tiene un lugar en la secuencia que sirve para identificarlo. Este identificador se llama número de registr o . Registro 1
Registro 2
Registro 3
Registro 4
y así …
Campos Cada registro está formado por campos. Cada campo se destina para contener un dato . Todos los registros tienen el mismo diseño de campos. Registro n
Artículo
Nombre
Precio
Cada campo tiene atributos: nombre, tipo de datos, ancho y decimales. Nombre
Tipo
Ancho
Decimales
Artículo
Carácter
3
-
Nombre
Carácter
30
-
Precio
Numérico
8
2
La definición de los atributos se hace una sola vez en el Diseñador de tablas . Esta definición se llama estructura de la tabla, o también estructura del registro , porque cada registro se ajusta a ella. Para crear una tabla: Primero se define la estructura. Luego se agregan registros con datos concretos. Para que la tabla exista, debe tener por lo menos la definición estructural. Si todavía no se le han agregado registros, se dice que está vacía.
Las tablas permiten tres tipos de operaciones con registros: Alta. Es incorporar un nuevo registro. Baja. Es eliminar un registro existente. La baja se hace en dos pasos:
Primero se marca el registro a eliminar, lo cual permite desmarcarlo si cambiamos de opinión. Luego se lo elimina definitivamente de la tabla. Cambio . Es modificar el dato de un campo de un registro existente.
Un recurso para dar altas, bajas y cambios es la ventana Examinar . La ventana Examinar se puede ver de dos formas: en modo Examinar y en modo Editar .
Modo Examinar . Los campos aparecen uno junto a otro. Cada renglón es un registro.
Modo Editar . Los campos aparecen uno bajo el otro. Cada banda es un registro.
Los modos Examinar y Editar son formas de ver los registros.
La forma en que se graban los registros en el disco es uno tras el otro. Registro 1
Registro 2
Etc.
O, mostrando sus campos: D01
Banqueta clásica
305.00
D02
Banqueta laqueada
134.00
Etc.
Tipos de tablas Hay dos tipos de tablas: (a) libres y (b) de base de datos (o tabla base).
Tablas libres . Son la forma más antigua. Toda la definición estructural se hace en la misma tabla. En el Diseñador de tablas, éstas se ven así:
Tablas de bases de datos (o tablas base). Son más eficientes. Parte de la definición estructural se guarda en la tabla y parte en la base de datos. En el Diseñador de tablas, éstas se ven así:
Diseñador de tablas El diseñador de tablas tiene 3 fichas.
Ficha Campos . Sirve para definir los campos y sus atributos. Cada campo ocupa un renglón. En las tablas de bases de datos, cada campo tiene más opciones en la parte inferior de la ficha.
Ficha Índices . Sirve para definir índices por distintos campos. Un índice ordena virtualmente los registros, sin cambiarlos de lugar en el archivo, es decir, sin cambiar los números de registro. Cada índice ocupa un renglón. Las tablas libres usan tres tipos de índice: normal , candidato y único . Las tablas de bases de datos agregan el tipo principal .
Ficha Tabla. Muestra información sobre la tabla. En las tablas bases, permiten definir reglas para controlar la validez de los registros.
Índices Los índices permiten ordenar virtualmente los registros de una tabla. Para construir un índice, hay que darle un nombre, un tipo y una expresión . Los índices se guardan en un único archivo, cuyo nombre es el nombre de la tabla y cuya extensión es CDX. Si la tabla se llama Artículos.dbf, el archivo de índices se llamará Artículos.cdx. Si queremos un índice por el campo Artículo, lo podemos llamar Artículo. El campo Artículo se dice que es la expresión del índice. Si queremos un índice por el campo Nombre, lo podemos llamar Nombre. El campo Nombre se dice que es la expresión del índice. En el archivo de índices Artículos.cdx, entonces, se guardarán los índices Artículo y Nombre.
Sea que la tabla Artículos tiene los siguientes tres registros: Artículo Nombre Precio B35
Silla
100
C42
Cama
200
A18
Mesa
200
Si activamos el índice Artículo, en la ventana Examinar veremos: Artículo Nombre
Prec io
Si activamos el índice Nombre, en la ventana Examinar veremos: Artículo Nombr e Prec io
A18
Mesa
200
C42
Cama
200
B35
Silla
100
A18
Mesa
200
C42
Cama
200
B35
Silla
100
Sólo puede haber un índice activo en un momento dado, o ninguno. Si no hay un índice activo, los registros se verán en el orden de grabación, es decir, de acuerdo al número de registro.
Tipos de índices Los tipos de índices son normal , único , candidato y principal . Para entenderlos, conviene saber qué son entradas de índice. Una entrada de índice es como un renglón de un cuaderno donde se registra información sobre un registro de la tabla. No todos los registros tienen entrada en el índice, porque eso depende del tipo de índice.
Índice normal . Todos los registros de la tabla tienen entradas en el índice. Creemos el índice normal Precio por el campo Precio. Luego activemos ese índice y veamos la tabla en la ventana Examinar. Artículo Nombr e Precio B35
Silla
100
C42
Cama
200
A18
Mesa
200
Índice único . Los registros con igual valor en la expresión de índice tienen entrada una sola vez en el índice. Creemos el índice único Precio por el campo Precio. Luego activemos ese índice y veamos la tabla en la ventana Examinar. Artículo Nombr e Precio B35
Silla
100
C42
Cama
200
El artículo con precio 200 es C42, porque fue el primero que se encontró al crear el índice. Un índice único sirve para saber cuántos precios distintos hay.
Índice candidato . Cada registro de la tabla tiene su entrada en el índice, pero el índice controla que en la tabla no se repitan valores en la expresión del índice. Si se da esta situación, se produce el error “Se ha vio lado la unici dad del índice”. El que haya tantas entradas como registros, entonces, se debe al impedimento de duplicar valores en el campo usado como expresión del índice. En la tabla Artículos, podríamos crear índices candidatos por Artículo y por Nombre, porque sus valores no se repiten. Pero no podríamos crear un índice candidato por Precio, porque se repite el valor 200. Una tabla puede tener los índices candidatos que se necesiten.
Índice principal . Funciona como los índices candidatos, pero una tabla puede tener un solo índice principal.
Expresión de índice La expresión de un índice puede ser el campo por el cual se construye el índice. Pero si nos limitáramos a campos, no podríamos indexar por otros conceptos. Por ejemplo, sea la tabla Resumen con los totales mensuales de ventas y costos. Mes Venta
Costo
1
125.000
75.000
2
48.000
31.000
Etc.
Etc.
Etc.
Si queremos un índice llamado Ganancia, por lo ganado en cada mes, deberemos usar la expresión Venta – Costo .
Sea la tabla Alumnos, con los campos Matrícula, Nombre, Carrera, etc. Matrícula Nombre
Carrera
00001
García, Juan
13
00025
Lucero, Mercedes
00032
Sarmiento, Raúl
15
00567
Moreno, Alberto
13
09021
Figueroa, Luis
1
1
Para crear un índice por Carrera y Nombre, debemos usar la expresión str(Carrera,2)+Nombre . Parece complicado, pero veremos que no lo es. Si activamos este índice, la tabla se verá: Matrícula Nombre
Carrera
09021
Figueroa, Luis
1
00025
Lucero, Mercedes
1
00001
García, Juan
13
00567
Moreno, Alberto
13
00032
Sarmiento, Raúl
15
Campos Memo En la tabla, cada campo tiene un ancho. Ningún contenido puede superar ese ancho. A veces, sin embargo, se necesitan contenidos extensos que varían de un registro a otro, como las historias clínicas de los pacientes o las observaciones sobre la conducta de los empleados. Una historia clínica puede tener un texto de miles de caracteres. El ancho máximo de un campo de caracteres, adecuado para texto, es 254. Pero queremos guardar la historia clínica de cada paciente en el registro que le corresponde en la tabla. ¿Cómo solucionar este problema? Para ello existen los campos memo .
Un campo memo tiene ancho 4 en la tabla. Acá se guarda un número, como si fuera una llamada a una nota de pie de página en un libro. El equivalente a la nota de pie de página se desarrolla en otro archivo, asociado a la tabla, cuyo nombre es el de la tabla y cuya extensión es FPT. Este archivo se crea automáticamente al definir el primer campo memo en el Diseñador de tablas. Este archivo permite que la nota no tenga límites en cuando a extensión. Cuando un campo memo de un registro contiene una llamada, en la tabla no se ve este número, porque es binario y difícil de ver, sino la palabra Memo , con M mayúscula. Si un campo memo de un registro no contiene una llamada, se ve la palabra memo , con m minúscula.
Para trabajar con un campo memo, se da doble clic donde dice memo o Memo . Esto abre una ventana de edición para introducir o modificar el texto de la nota. Para ir guardando el contenido del campo memo se usa Archivo – Guardar . Nunca se abrirá el diálogo Guardar como , porque ya existe el archivo FPT donde se guardará el contenido. Cuando se termina el trabajo de edición, se sale de la ventana de edición con Arc hivo – Cerrar . Para guardar y salir de la ventana de edición en una sola operación, se usa Ctrl + W. Para eliminar todo el contenido del campo memo, se selecciona el texto, se lo elimina y se pulsa Ctrl + W. En la tabla se visualizará ese campo como memo , con m minúscula, porque no tiene contenido.
Diseñador de bases de datos Muestra tablas, relaciones y vistas. Tiene el siguiente aspecto:
Cursores . Las tablas y vistas se ven como cursores. Un cursor es una ventanita que muestra los campos e índices de las tablas y los campos de las vistas. Un cursor se puede mover y cambiar de tamaño. Si el contenido no se ve en su totalidad, aparece una barra de desplazamiento vertical.
Relaciones . Una relación es un vínculo entre dos tablas. En una BD, las relaciones tienen las siguientes características: Son permanentes . Existen mientras no se las destruya. Sirven para definir reglas de integridad referencial .
Las relaciones permanentes se trazan arrastrando de un índice principal o candidato de una tabla a un índice de cualquier tipo de otra tabla. La tabla de partida se llama madre, principal o parent . La tabla de llegada se llama hija, secundaria o child .
El índice de partida debe ser principal o candidato.
Si el índice de llegada es principal o candidato, la relación se dice de uno a uno y se representa 1 – 1.
Si el índice de llegada es normal o único, la relación se dice de uno a varios y se representa 1 – N.
Integridad referencial (IR) El buen diseño de tablas distribuye la información de un cliente, proveedor, alumno, etc., entre varias tablas. Por ejemplo, los datos referidos al cliente como persona (código de cliente, nombre, domicilio, teléfono, CUIT, etc.), se colocan en el registro de una tabla. Si hay 100 clientes, habrá 100 registros. Los datos referidos a las compras de un cliente se colocan en uno o más registros de otra u otras tablas (código de cliente, artículo, precio, cantidad). Para unir estos registros con el registro del cliente, se usa el código de cliente. Aunque esté en varias tablas, la información del cliente es un todo. Esto exige cuidar que la información parcializada de las distintas tablas sea coherente y no se pierda ninguna parte. De esto se ocupa la integridad referencial, que usa reglas para controlar las altas , bajas y cambios de registros.
IR. Reglas para cambios en la clave de la tabla madre No se refieren al cambio de cualquier campo, sino del campo que une ambas tablas, como el código de cliente en el ejemplo. Se dice que este campo es la clave de la unión. Si cambiamos la clave de un cliente en la tabla madre, corremos el riesgo de romper la integridad de información del cliente. La ruptura se dará cuando ese cliente haya realizado compras.
Cascada. Cuando se cambia la clave de un registro en la tabla madre, se cambia automáticamente igual clave en los registros de la tabla hija. Por ejemplo, si cambiamos la clave 125 por 300 de un cliente en la tabla madre, automáticamente todas las compras del cliente 125 cambian a 300 en la tabla hija. Si cambiamos el domicilio del cliente en la tabla madre, esta regla no se aplica, porque el domicilio no es clave.
Restringir . Impide cambiar la clave un registro en la tabla madre si tiene registros con igual clave en la tabla hija. Por ejemplo, si el cliente 125 tiene registros en la tabla hija, no se podrá cambiar esta clave.
Ignorar . Permite cambiar la clave de un registro en la tabla madre sin tener en cuenta si tiene o no registros con igual clave en la tabla hija. Es, en realidad, la carencia de regla. Esta carencia puede provocar la disociación de la integridad de la información, con resultados caóticos. Por ejemplo, si cambiamos la clave del cliente 125 por 300 en la tabla madre, se disociarán los registros de compras con clave 125 en la tabla hija, que ahora se referirán a un cliente inexistente.
IR. Reglas para bajas de registros en la tabla madre Se refieren a marcar un registro para destruir en la tabla madre. Como este registro tiene una clave, puede haber registros con igual clave en la tabla hija. Esto debe ser controlado.
Cascada. Si se marca un registro para destruir en la tabla madre, se marcan automáticamente los registros con igual clave en la tabla hija. Pero si se desmarca el registro en la tabla madre, no se produce ningún efecto en la tabla hija. Por ejemplo, si se marca para destruir el registro con clave 125 en la tabla madre, todos los registros con clave 125 en la tabla hija se marcan automáticamente. Si luego se eliminan físicamente los registros marcados, se perderá definitivamente toda la información sobre el cliente 125.
Restringir . Impide marcar en la tabla madre un registro con una clave que existe en registros de la tabla hija. La regla no se opone a marcar registros de la tabla madre cuyas claves no existen en la tabla hija. Por ejemplo, si el cliente 125 tiene registros de compras, no podremos marcarlo para destruir, de modo que nunca podremos eliminar la historia completa de tal cliente. Para eliminar toda la historia del cliente 125, debemos usar otro procedimiento: primero habrá que eliminar sus registros en la tabla hija y después eliminar el registro de la tabla madre.
Ignorar . Permite marcar un registro de la tabla madre, sin tener en cuenta si tiene o no registros con igual clave en la tabla hija. Es una carencia de regla, que puede provocar caos. Por ejemplo, si marco para destruir el cliente 125 en la tabla madre y luego lo elimino definitivamente, en la tabla hija quedarán compras del cliente 125 que ya no existe en la madre.
IR. Reglas para altas de registros en la tabla hija Se refieren a altas de registros en la hija, que deben tener una clave. Lo lógico es que tal clave exista en un registro de la madre, para que haya integridad de información. Si esto no sucediera, sería un error, situación que trata de controlar la regla Restringir.
Restringir . Impide dar de alta un registro en la hija con una clave que no exista en la madre. Por ejemplo, no puedo dar de alta una compra del cliente 950, si tal cliente no está definido en la madre. La regla controla otra situación: sin necesidad de dar una alta, no podríamos cambiar la clave 125 a 300 de una compra, si no existe un cliente 300 en la madre.
Ignorar . Permite dar altas de registros en la hija, sin tener en cuenta si hay o no un registro con igual clave en la madre. Es la carencia de regla, que puede provocar información no íntegra. Por ejemplo, se puede dar de alta a una compra con clave 950, exista o no un cliente con esa clave en la madre. Tampoco se controla la segunda situación: se puede cambiar una clave en un registro de la tabla hija sin considerar lo que pasa en la tabla madre. Por ejemplo, podremos cambiar una compra del cliente 125 por 950, exista o no un cliente 950 en la tabla madre.