[Lazarus-es] Llaves

Lissy Amador 01_lamador en soporteavanzado.com
Sab Dic 4 00:43:03 CET 2010


Gracias por la info.
tengo que irme pero me servira de mucho
----- Mensaje original -----
De: José Mejuto <joshyfun en gmail.com>
Para: Spanish version of Lazarus List <lazarus-es en lists.lazarus.freepascal.org>
Enviado: Fri, 03 Dec 2010 23:34:05 -0000 (UTC)
Asunto: Re: [Lazarus-es] Llaves

Hello Lissy,

Friday, December 3, 2010, 9:43:16 PM, you wrote:

LA> en una tabla solo puedo tener una llave, o puedo tener una llave de cada clase?
LA> que tanto cambia el uso de llaves, me refiero al hacer una tabla, puedo declarar
LA> un campo como llave o no lo puedo hacer, cuales son las ventajas de declarar
LA> campos con X tipo de llave

Uso inglés, la "traducciones" al español suelen hacerse diferentes en
cada pais y claro, luego nadie se entiende:

Primary Key: Identifica inequívocamente un único registro en la tabla
en la que está presente. Es "unique" o sea, que no puede repetirse. No
puede ser NULL. Normalmente se genera con un campo de autoincremento o
con un trigger "Before Insert". Suele ser INTEGER o INT64 según
necesidades. Se crea un index para ese campo.

Key Index: Se usa para un acceso rápido a uno o varios registros
dentro de una tabla. Se genera un index para ese campo. Puede aceptar
NULLs, puede tener o no duplicados (varios registros con el mismo
valor). Acceso rápido a los registros que cumplen una condición que se
comprueba sobre ese campo.

Foreign Key: Suele ser un campo que apunta a un valor de un "Primary
Key" de otra tabla. El campo enlazado no es obligatorio que sea una
"Primary Key". Se usa para enlazar virtualmente dos tablas y para
mantener la integridad referencial. Esto es, que si tenemos por
ejemplo una tabla de facturas esta tiene una "Foreign Key" con la
tabla clientes, de modo que si el usuario intenta borrar un cliente
que tiene facturas asignadas, no nos deja (excepción) o si se lo hemos
indicado, primero nos borra todas las facturas del cliente y luego el
cliente. También crea un indice en disco para ese campo.

Ejemplo de BD usando las claves:

Tabla Clientes
--------------
IDCLIENTE      -> Primary key, autoincrementado.
NOMBRE_CLIENTE -> Texto (Varchar)

Tabla Facturas
--------------
IDFACTURA -> Primary Key, autoincrementado.
IDCLIENTE -> Foreign Key en CLIENTES.IDCLIENTE
CODFACTURA-> Index Key, unique, non-NULL. (numérico o texto)
IMPORTE   -> Valor numérico

Tabla Albaranes
---------------
IDALBARAN -> Primary Key, autoincrementado.
IDCLIENTE -> Foreign Key en CLIENTES.IDCLIENTE (non-NULL)
IDFACTURA -> Foreign Key en FACTURAS.IDFACTURA (Permitir NULLs)
CONCEPTO  -> Texto
IMPORTE   -> Numérico.

Si pretendemos borrar un cliente nos dará error bien si tiene facturas
asignadas, o bien si tiene alabaranes asignados, si no es así lo borra
perfectamente.

Si pretendemos borrar una factura nos dará error si hay uno o más
albaranes asignados a esa factura, de modo que al diseñar la base de
datos, en concreto la "Foreign Key" de Albaranes->Facturas le decimos
que "SET TO NULL", de modo que cuando borramos una factura, no borra
los albaranes, si no que pone el campo "ALBARANES.IDFACTURA" a NULL
indicando que no hay factura asignada. Si le decimos que "CASCADE" si
borramos la factura nos borrará los albaranes asociados.

Las mismas comprobaciones se hacen al ingresar nuevos datos, las
"Foreign Key" no nos dejan crear una factura que apunte a un cliente
que no existe, pero si nos deja crear un albarán que no tiene factura
ya que su "foreign key" (ALBARANES.IDFACTURA) acepta NULLs. Pero no
permite asignar un albarán a una factura que no existe, de modo que
ALBARANES.IDFACTURA sólo acepta como valores cualquiera que esté en
FACTURAS.IDFACTURA o NULL.

Hay más tipos de índices como los composite, hay más modos de trabajo
de las "Foreign Key", pero esos son los más comunes y los que suelen
estar presentes en todas las RDBMS.

-- 
Best regards,
 José


_______________________________________________
Lazarus-es mailing list
Lazarus-es en lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es





More information about the Lazarus-es mailing list