Sei sulla pagina 1di 11

Conjunto de entidades

Un conjunto de entidades es un contenedor lgico para las instancias de un tipo de entidad y las
instancias de cualquier tipo que se deriven de ese tipo de entidad. (Para obtener informacin acerca
de los tipos derivados, vea Entity Data Model: Herencia). La relacin entre un tipo de entidad y un
conjunto de entidades es anloga a la relacin entre una fila y una tabla en una base de datos
relacional: al igual que una fila, un tipo de entidad describe la estructura de los datos y, al igual que
una tabla, un conjunto de entidades contiene instancias de una determinada estructura. Un
conjunto de entidades no es una construccin de modelado de datos, ya que no describe la
estructura de los datos. En su lugar, un conjunto de entidades proporciona una construccin para
que un entorno de hospedaje o de almacenamiento (como Common Language Runtime o una base
de datos de SQL Server) agrupe las instancias del tipo de entidad y se puedan asignar a un almacn
de datos.
Un conjunto de entidades se define dentro de un contenedor de entidades, que es una agrupacin
lgica de conjuntos de entidades yconjuntos de asociaciones.
Para que una instancia de tipo de entidad exista en un conjunto de entidades, deben cumplirse las
condiciones siguientes:
El tipo de la instancia puede ser el mismo que el tipo de entidad en el que se basa el
conjunto de entidades, o un subtipo del tipo de entidad.
La clave de entidad para la instancia es nica dentro del conjunto de entidades.
La instancia no existe en ningn otro conjunto de entidades.
Nota
Se pueden definir varios conjuntos de entidades usando el mismo tipo de entidad, pero una instancia de un tipo de
entidad determinado solo puede existir en un conjunto de entidades.
No es necesario definir un conjunto de entidades para cada tipo de entidad de un modelo
conceptual.
Ejemplo
El diagrama siguiente muestra un modelo conceptual con tres tipos de
entidad: Book, Publisher y Author.

El diagrama siguiente muestra dos conjuntos de entidades (Books y Publishers) y un conjunto de
asociaciones (PublishedBy) basados en el modelo conceptual mostrado anteriormente. En el
conjunto de entidades Books, Bi representa una instancia del tipo de entidadBook en tiempo de
ejecucin. De igual forma, Pj representa una instancia de Publisher en el conjunto de
entidades Publishers. BiPjrepresenta una instancia de la asociacin PublishedBy en el conjunto de
asociaciones PublishedBy.

ADO.NET Entity Framework usa un lenguaje especfico de dominio (DSL) denominado lenguaje de
definicin de esquemas conceptuales (CSDL) para definir los modelos conceptuales. El cdigo CSDL
siguiente define un contenedor de entidades con un conjunto de entidades para cada tipo de
entidad del modelo conceptual mostrado anteriormente. Tenga en cuenta que el nombre y el tipo
de entidad de cada conjunto de entidades se definen mediante atributos XML.
XML

<EntityContainer Name="BooksContainer" >
<EntitySet Name="Books" EntityType="BooksModel.Book" />
<EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
<EntitySet Name="Authors" EntityType="BooksModel.Author" />
<AssociationSet Name="PublishedBy"
Association="BooksModel.PublishedBy">
<End Role="Book" EntitySet="Books" />
<End Role="Publisher" EntitySet="Publishers" />
</AssociationSet>
<AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
<End Role="Book" EntitySet="Books" />
<End Role="Author" EntitySet="Authors" />
</AssociationSet>
</EntityContainer>


Es posible definir varios conjuntos de entidades por tipo (MEST). El cdigo CSDL siguiente define un
contenedor de entidades con dos conjuntos de entidades para el tipo de entidad Book:
XML

<EntityContainer Name="BooksContainer" >
<EntitySet Name="Books" EntityType="BooksModel.Book" />
<EntitySet Name="FictionBooks" EntityType="BooksModel.Book" />
<EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
<EntitySet Name="Authors" EntityType="BooksModel.Author" />
<AssociationSet Name="PublishedBy"
Association="BooksModel.PublishedBy">
<End Role="Book" EntitySet="Books" />
<End Role="Publisher" EntitySet="Publishers" />
</AssociationSet>
<AssociationSet Name="BookAuthor" Association="BooksModel.BookAuthor">
<End Role="Book" EntitySet="Books" />
<End Role="Author" EntitySet="Authors" />
</AssociationSet>
</EntityContainer>


Tipos de atributos
Los atributos compuestos se pueden dividir en sub-partes ms pequeas, que
representan atributos ms bsicos con significados propios. Por ejemplo, una
"direccin" puede sub-dividirse en: dir-calle, comuna, ciudad, regin. Ejemplo:



Los atributos no sub-dividibles se llaman atmicos o simples. Si no hay
necesidad de referirse a los elementos individuales de una direccin, entonces
la direccin completa puede considerarse un atributo simple.

Atributos de valor simple son los que tienen un slo valor para una entidad
particular. Por ejemplo: edad.

Atributos multivalorados pueden tener un conjunto de valores para una misma
entidad. Por ejemplo: "ttulos profesionales" (una persona puede no tener
ninguno, uno, dos o ms).

En algunos casos una entidad particular puede no tener valores aplicables para
un atributo. Ejemplo: "depto". Para estas situaciones tenemos un valor especial
llamado nulo. Tambin, si no se conoce el valor.

Un tipo de entidad define un conjunto de entidades con los mismos atributos.
Ejemplo:

Nombre del tipo de entidad: EMPLEADO
Atributos: Nombre, Edad, Sueldo
Conjunto de entidades: (Juan Prez, 55, 800.000), (Federico Pardo, 40, 550.000),
(Rodrigo Pozo, 25, 400.000).

En los diagramas E-R, un tipo de entidad se representa como una caja
rectangular, los nombres de los atributos como elipses y las relaciones como
rombos. Los atributos multivalorados se representan con elipses dobles.

Un tipo de atributo usualmente tiene un atributo cuyos valores son distintos
para cada entidad individual (atributo clave o llave) y sus valores se usan para
identificar cada entidad unvocamente. Para una entidad tipo PERSONA, un
atributo clave tpico es el RUT. Algunas veces, varios atributos juntos forman
una clave (la combinacin debe ser distinta). Estos atributos clave aparecen
subrayados en los diagramas.

Cada atributo simple tiene un conjunto de valores o dominio asociado, que
especifica el conjunto de valores que puede asignarse a cada entidad individual.
Por ejemplo, si las edades de los empleados pueden variar entre 16 y 70,
entonces el dominio de Edad es {x N / 16 <= x <= 70}. Los dominios no se
muestran en los diagramas.

Un atributo A del tipo de entidad E cuyo dominio es V, puede definirse como
una funcin de E al conjunto potencia V (conjunto de todos los subconjuntos de
V):


A: E P(V)
El valor del atributo A para la entidad e es A(e). Un valor nulo se representa por
el conjunto vaco.

Para un atributo compuesto A, el dominio V es el producto cartesiano de P(V
1
),
..., P(V
n
) donde V
1
, ..., V
n
son los dominios de los atributos simples que forman A:


V = P(V
1
) x P(V
2
) x ... x P(V
n
).
Notemos que atributos compuestos y multivalorados pueden ser anidados de
cualquier manera. Podemos representar anidamiento agrupando componentes
de un atributo compuesto entre parntesis ( ), separando componentes con
comas, y mostrando atributos multivalorados entre llaves { }.

Ejemplo: Si una persona puede tener ms de una direccin, y en cada una de
ellas hay mltiples telfonos, podemos especificar un atributo DirTel para una
PERSONA as:


{ DirTel ( { Telfono ( CodigoArea, NumTel ) }, Direccin ( DirCalle ( Calle,
Nmero, NumDepto ), Comuna, Ciudad, Regin ) ) }
La persona Juan Prez puede tener una instancia de este atributo as:


{ DirTel ( { Telfono ( 2, 442-2855 ) }, Direccin ( DirCalle ( Blanco, 2120,
nulo ), Santiago, Santiago, RM ) ), DirTel ( { Telfono ( 2, 241-3416 ) },
Direccin ( DirCalle ( Manuel Montt, 74, 201 ), Providencia, Santiago, RM )
) }

Definicin de claves y para que se usan
ndices
Tenemos tres tipos de ndices. El primero corresponde a las claves primarias, que
como vimos, tambin se pueden crear en la parte de definicin de columnas.
Claves primarias
La sintaxis para definir claves primarias es:
definicin_columnas
| PRIMARY KEY (index_nombre_col,...)
El ejemplo anterior que vimos para crear claves primarias, usando esta sintaxis,
quedara as:
mysql> CREATE TABLE ciudad4 (nombre CHAR(20) NOT NULL,
-> poblacion INT NULL DEFAULT 5000,
-> PRIMARY KEY (nombre));
Query OK, 0 rows affected (0.17 sec)
Pero esta forma tiene ms opciones, por ejemplo, entre los parntesis podemos
especificar varios nombres de columnas, para construir claves primarias compuestas
por varias columnas:
mysql> CREATE TABLE mitabla1 (
-> id1 CHAR(2) NOT NULL,
-> id2 CHAR(2) NOT NULL,
-> texto CHAR(30),
-> PRIMARY KEY (id1, id2));
Query OK, 0 rows affected (0.09 sec)

mysql>
ndices
El segundo tipo de ndice permite definir ndices sobre una columna, sobre varias, o
sobre partes de columnas. Para definir estos ndices se usan indistintamente las
opciones KEY o INDEX.
mysql> CREATE TABLE mitabla2 (
-> id INT,
-> nombre CHAR(19),
-> INDEX (nombre));
Query OK, 0 rows affected (0.09 sec)
O su equivalente:
mysql> CREATE TABLE mitabla3 (
-> id INT,
-> nombre CHAR(19),
-> KEY (nombre));
Query OK, 0 rows affected (0.09 sec)
Tambin podemos crear un ndice sobre parte de una columna:
mysql> CREATE TABLE mitabla4 (
-> id INT,
-> nombre CHAR(19),
-> INDEX (nombre(4)));
Query OK, 0 rows affected (0.09 sec)
Este ejemplo usar slo los cuatro primeros caracteres de la columna 'nombre' para
crear el ndice.
Claves nicas
El tercero permite definir ndices con claves nicas, tambin sobre una columna, sobre
varias o sobre partes de columnas. Para definir ndices con claves nicas se usa la
opcin UNIQUE.
La diferencia entre un ndice nico y uno normal es que en los nicos no se permite la
insercin de filas con claves repetidas. La excepcin es el valor NULL, que s se puede
repetir.
mysql> CREATE TABLE mitabla5 (
-> id INT,
-> nombre CHAR(19),
-> UNIQUE (nombre));
Query OK, 0 rows affected (0.09 sec)
Una clave primaria equivale a un ndice de clave nica, en la que el valor de la clave no
puede tomar valores NULL. Tanto los ndices normales como los de claves nicas s
pueden tomar valores NULL.
Por lo tanto, las definiciones siguientes son equivalentes:
mysql> CREATE TABLE mitabla6 (
-> id INT,
-> nombre CHAR(19) NOT NULL,
-> UNIQUE (nombre));
Query OK, 0 rows affected (0.09 sec)
Y:
mysql> CREATE TABLE mitabla7 (
-> id INT,
-> nombre CHAR(19),
-> PRIMARY KEY (nombre));
Query OK, 0 rows affected (0.09 sec)
Los ndices sirven para optimizar las consultas y las bsquedas de datos. Mediante su
uso es mucho ms rpido localizar filas con determinados valores de columnas, o
seguir un determinado orden. La alternativa es hacer bsquedas secuenciales, que en
tablas grandes requieren mucho tiempo.
Claves forneas
En MySQL slo existe soporte para claves forneas en tablas de tipo InnoDB. Sin
embargo, esto no impide usarlas en otros tipos de tablas.
La diferencia consiste en que en esas tablas no se verifica si una clave fornea existe
realmente en la tabla referenciada, y que no se eliminan filas de una tabla con una
definicin de clave fornea. Para hacer esto hay que usar tablas InnoDB.
Hay dos modos de definir claves forneas en bases de datos MySQL.
El primero, slo sirve para documentar, y, al menos en las pruebas que he hecho, no
define realmente claves forneas. Esta forma consiste en definir una referencia al
mismo tiempo que se define una columna:
mysql> CREATE TABLE personas (
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> nombre VARCHAR(40),
-> fecha DATE);
Query OK, 0 rows affected (0.13 sec)

mysql> CREATE TABLE telefonos (
-> numero CHAR(12),
-> id INT NOT NULL REFERENCES personas (id)
-> ON DELETE CASCADE ON UPDATE CASCADE); (1)
Query OK, 0 rows affected (0.13 sec)

mysql>
Hemos usado una definicin de referencia para la columna 'id' de la tabla 'telefonos',
indicando que es una clave fornea correspondiente a la columna 'id' de la tabla
'personas' (1). Sin embargo, aunque la sintaxis se comprueba, esta definicin no
implica ningn comportamiento por parte de MySQL.
La otra forma es mucho ms til, aunque slo se aplica a tablas InnoDB.
En esta forma no se aade la referencia en la definicin de la columna, sino despus de
la definicin de todas las columnas. Tenemos la siguiente sintaxis resumida:
CREATE TABLE nombre
definicin_de_columnas
[CONSTRAINT [smbolo]] FOREIGN KEY [nombre_index]
(nombre_col_index,...)
[REFERENCES nombre_tabla [(nombre_col,...)]
[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION | SET
DEFAULT]
[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION | SET
DEFAULT]]
El ejemplo anterior, usando tablas InnoDB y esta definicin de claves forneas
quedar as:
mysql> CREATE TABLE personas2 (
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> nombre VARCHAR(40),
-> fecha DATE)
-> ENGINE=InnoDB;
Query OK, 0 rows affected (0.13 sec)

mysql> CREATE TABLE telefonos2 (
-> numero CHAR(12),
-> id INT NOT NULL,
-> KEY (id), (2)
-> FOREIGN KEY (id) REFERENCES personas2 (id)
-> ON DELETE CASCADE ON UPDATE CASCADE) (3)
-> ENGINE=InnoDB;
Query OK, 0 rows affected (0.13 sec)

mysql>
Es imprescindible que la columna que contiene una definicin de clave fornea est
indexada (2). Pero esto no debe preocuparnos demasiado, ya que si no lo hacemos de
forma explcita, MySQL lo har por nosotros de forma implcita.
Esta forma define una clave fornea en la columna 'id', que hace referencia a la
columna 'id' de la tabla 'personas' (3). La definicin incluye las tareas a realizar en el
caso de que se elimine una fila en la tabla 'personas'.
ON DELETE <opcin>, indica que acciones se deben realizar en la tabla actual si se
borra una fila en la tabla referenciada.
ON UPDATE <opcin>, es anlogo pero para modificaciones de claves.
Existen cinco opciones diferentes. Veamos lo que hace cada una de ellas:
RESTRICT: esta opcin impide eliminar o modificar filas en la tabla
referenciada si existen filas con el mismo valor de clave fornea.
CASCADE: borrar o modificar una clave en una fila en la tabla
referenciada con un valor determinado de clave, implica borrar las filas con
el mismo valor de clave fornea o modificar los valores de esas claves
forneas.
SET NULL: borrar o modificar una clave en una fila en la tabla
referenciada con un valor determinado de clave, implica asignar el
valor NULL a las claves forneas con el mismo valor.
NO ACTION: las claves forneas no se modifican, ni se eliminan filas en
la tabla que las contiene.
SET DEFAULT: borrar o modificar una clave en una fila en la tabla
referenciada con un valor determinado implica asignar el valor por defecto
a las claves forneas con el mismo valor.
Por ejemplo, veamos esta definicin de la tabla 'telefonos':
mysql> CREATE TABLE personas3 (
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> nombre VARCHAR(40),
-> fecha DATE)
-> ENGINE=InnoDB;
Query OK, 0 rows affected (0.13 sec)

mysql> CREATE TABLE telefonos3 (
-> numero CHAR(12),
-> id INT NOT NULL,
-> KEY (id),
-> FOREIGN KEY (id) REFERENCES personas3 (id)
-> ON DELETE RESTRICT ON UPDATE CASCADE)
-> ENGINE=InnoDB;
Query OK, 0 rows affected (0.13 sec)

mysql>
Si se intenta borrar una fila de 'personas3' con un determinado valor de 'id', se
producir un error si existen filas en la tabla 'telefonos3' con mismo valor en la
columna 'id'. La fila de 'personas3' no se eliminar, a no ser que previamente
eliminemos las filas con el mismo valor de clave fornea en 'telfonos3'.
Si se modifica el valor de la columna 'id' en la tabla 'personas3', se modificarn los
valores de la columna 'id' para mantener la relacin.
Veamos un ejemplo ms prctico:
personas3
id nombre fecha
1 Fulanito 1998/04/14
2 Menganito 1975/06/18
3 Tulanito 1984/07/05

telefonos3
numero id
12322132 1
12332221 1
55546545 3
55565445 3
Si intentamos borrar la fila correspondiente a "Fulanito" se producir un error, ya que
existen dos filas en 'telefonos' con el valor 1 en la columna 'id'.
S ser posible borrar la fila correspondiente a "Menganito", ya que no existe ninguna
fila en la tabla 'telefonos3' con el valor 2 en la columna 'id'.
Si modificamos el valor de 'id' en la fila correspondiente a "Tulanito", por el valor 4,
por ejemplo, se asignar el valor 4 a la columna 'id' de las filas 3 y 4 de la tabla
'telefonos3':
personas3
id nombre fecha
1 Fulanito 1998/04/14
2 Menganito 1975/06/18
4 Tulanito 1984/07/05

telefonos3
numero id
12322132 1
12332221 1
55546545 4
55565445 4
No hemos usado todas las opciones. Las opciones de MATCH FULL, MATCH
PARTIAL o MATCH SIMPLE no las comentaremos de momento (lo dejaremos para
ms adelante).
La parte opcional CONSTRAINT [smbolo] sirve para asignar un nombre a la clave
fornea, de modo que pueda usarse como identificador si se quiere modificar o
eliminar una definicin de clave fornea. Tambin veremos esto con ms detalle en
captulos avanzados.

Potrebbero piacerti anche