Bases de datos
Cualquier
aplicación de interés requiere el almacenamiento y posterior recuperación de
los datos con los que trabaje (pedidos en aplicaciones de comercio electrónico,
datos de personal para las aplicaciones de recursos humanos, datos de clientes
en sistemas CRM, etc.). Los sistemas de gestión de bases de datos (DBMSs) nos
permiten almacenar, visualizar y modificar datos, así como hacer copias de
seguridad y mantener la integridad de los datos, proporcionando una serie de
funciones que facilitan el desarrollo de nuevas aplicaciones.
Desde
un punto de vista intuitivo, una base de datos no es más que un fondo común de
información almacenada en una computadora para que cualquier persona o programa
autorizado pueda acceder a ella, independientemente de su lugar de procedencia
y del uso que haga de ella. Algo más formalemente, una base de datos es un
conjunto de datos comunes a un "proyecto" que se almacenan sin
redundancia para ser útiles en diferentes aplicaciones.
El
Sistema de Gestión de Bases de Datos (DBMS) es el software con capacidad para
definir, mantener y utilizar una base de datos. Un sistema de gestión de bases
de datos debe permitir definir estructuras de almacenamiento, así como acceder
a los datos de forma eficiente y segura. Ejemplos: Oracle, IBM DB2, Microsoft
SQL Server, Interbase...
En una base de datos,
los datos se organizan independientemente de las aplicaciones que los vayan a
usar (independencia lógica) y de los ficheros en los que vayan a almacenarse
(independencia física). Además, los datos deben ser accesibles a los usuarios
de la manera más amigable posible, generalmente mediante lenguajes de consulta
como SQL o Query-by-example. Por otro lado, es esencial que no exista
redundancia (esto es, los datos no deben estar duplicados) para evitar
problemas de consistencia e integridad.
Bases de datos relacionales
- Tabla
o relación: Colección de registros acerca de entidades de un tipo específico
(p.ej. alumnos).
- Atributo,
campo o columna: Propiedad asociada a una entidad (p.ej. nombre, apellidos...).
Cada atributo tiene un tipo asociado (p.ej. entero, cadena de caracteres...) y
puede tomar el valor nulo (null).
- Tupla,
registro o fila: Datos relativos a un objeto distinguible de otros (p.ej. un
alumno concreto).
Se
pueden estrablecer relaciones entre las tablas de una base de datos relacional
mediante el uso de claves primarias y claves externas (p.ej. cada libro tiene,
al menos, un autor).
- Clave
primaria: Conjunto de atributos que nos permiten identificar unívocamente
a una entidad dentro de un conjunto de entidades (p.ej. número de matrícula).
La clave primaria garantiza la unicidad de una tupla, pues no se permite la
existencia de varios registros que compartan su clave primaria.
- Clave
externa: Conjunto de atributos que hacen referencia a otra tabla, lo que
nos permite establecer relaciones lógicas entre distintas tablas. Los valores
de los atributos de la clave externa han de coincidir con los valores de los
atributos de una clave (usualmente la primaria) en una de las tuplas de la
tabla a la que se hace referencia (integridad referencial).
SQL
Lenguaje
estándar para acceder a una base de datos relacional, estandarizado por el
American National Standards Institute (ANSI): SQL-92. En gran parte, los
distintos DBMS utilizan todos el mismo SQL, si bien cada vendedor le ha añadido
sus propias extensiones. El lenguaje SQL se divide en:
- DDL (Data Definition Language), utilizado para crear y modificar la estructura de la base de datos (p.ej. CREATE TABLE).
- DML (Data Manipulation Language), empleado para manipular los datos almacenados en la base de datos (p.ej. consultas con la sentencia SELECT).
- DCL (Data Control Language), para establecer permisos de acceso (GRANT, REVOKE, DENY) y gestionar transacciones (COMMIT y ROLLBACK).
Interfaces de acceso a bases de
datos
Evolución
histórica de los "estándares" propuestos por Microsoft:
- ODBC (Open Database Connectivity): API estándar ampliamente utilizado, disponible para múltiples DBMSs, utiliza SQL para acceder a los datos.
- DAO (Data Access Objects): Interfaz para programar
con bases de datos JET/ISAM, utiliza automatización OLE y ActiveX.
- RDO (Remote Data Objects): Fuertemente acoplado a
ODBC, orientado al desarrollo de aplicaciones cliente/servidor.
- OLE DB: Construido sobre COM, permite acceder a bases de datos tanto
relacionales como no relacionales (no está restringido a SQL). Se puede emplear
con controladores ODBC y proporciona un interfaz a bajo nivel en C++.
- ADO (ActiveX Data Objects): Ofrece un interfaz
orientado a objetos y proporciona un modelo de programación para OLE DB
accesible desde lenguajes distintos a C++ (p.ej. Visual Basic).
ADO se diseñó para su
uso en arquitecturas cliente/servidor con bases de datos relacionales (no
jerárquicas, como es el caso de XML). Su diseño no está demasiado bien
factorizado (ya que existen muchas formas de hacer las cosas y algunos objetos
acaparan demasiadas funciones) y ADO no estaba pensado para arquitecturas
multicapa en entornos distribuidos.
ADO
.NET es una colección de clases,
interfaces, estructuras y tipos enumerados que permiten acceder a los datos
almacenados en una base de datos desde la plataforma .NET. Si bien se puede
considerar una versión mejorada de ADO, no comparte con éste su jerarquía de
clases (aunque sí su funcionalidad).
ADO
.NET combina las capas ADO y OLE DB en una única capa de proveedores (managed
providers). Cada proveedor contiene un conjunto de clases que implementan
interfaces comunes para permitir el acceso uniforme a distintas fuentes de
datos. Ejemplos: ADO Managed Provider (da acceso a cualquier fuente de datos
OLE DB), SQL Server Managed Provider (específico para el DBMS de Microsoft),
Exchange Managed Provider (datos almacenados con Microsoft Exchange)...
ADO .NET usa XML. De
hecho, los conjuntos de datos se almacenan internamente en XML, en vez de
almacenarse en binario como sucedía en ADO. Al estar los datos almacenados en
XML, se simplifica el acceso a los datos a través de HTTP (algo que ocasiona
problemas en ADO si los datos tienen que pasar cortafuegos). Por otro lado, se
simplifica la comunicación entre aplicaciones al ser XML un formato estándar
(p.ej. comunicación con applets Java).
Con
ADO .NET se puede acceder a los datos de dos formas distintas:
- Acceso conectado:
Acceso sólo de lectura con cursores unidireccionales ("firehose
cursors"). La aplicación realiza una consulta y lee los datos conforme los
va procesando con la ayuda de un objeto
DataReader.
- Acceso desconectado: La aplicación ejecuta la consulta y almacena
los resultados de la misma para procesarlos después accediendo a un objeto de
tipo
DataSet
. De esta forma, se minimiza el tiempo que permanece abierta la conexión con la base de datos.
Al proporcionar conjuntos de datos de forma desconectada, se
utilizan mejor los recursos de los servidores y se pueden construir sisyemas
más escalables que con ADO (que mantenía abierta la conexión con la base de
datos la mayor parte del tiempo). Este enfoque resulta más adecuado en sistemas
distribuidos como Internet.
Arquitectura ADO.NET
El funcionamiento de ADO.NET se basa esencialmente en utilizar los
siguientes componentes:
- Data Provider (proveedor
de datos): Proporciona un acceso uniforme a conjuntos de datos (bases de datos
relacionales o información ID3 de ficheros MP3). Su papel el similar al de un
controlador ODBC o JDBC.
- DataSet: El
componente más importante, puede almacenar datos provenientes de múltiples
consultas (esto es, múltiples tablas).
- DataAdapter:
Sirve de enlace entre el contenedor de conjuntos de datos (DataSet) y la base
de datos (Data Provider).
Los
componentes anteriores se completan con DataReader (para
realizae eficientemente lecturas de grandes cantidades de datos que no caben en
memoria), DataRelation (la forma de establecer una reunión
entre dos tablas), Connection (utilizada por DataAdapter para
conectarse a la base de datos) y Command (que permite
especificar las órdenes, generalmente en SQL, que nos permiten consultar y
modificar el contenido de la base de datos: select, insert, delete y update).
Un
proveedor de datos debe proporcionar una implementación de Connection, Command,
DataAdapter y DataReader.
El
modo de funcionamiento típico de ADO.NET es el siguiente:
- Se crean un objeto Connection especificando la cadena de conexión.
- Se crea un DataAdapter.
- Se crea un objeto Command asociado al DataAdapter, con la conexión adecuada y la sentencia SQL que haya de ejecutarse.
- Se crea un DataSet donde almacenar los datos.
- Se abre la conexión.
- Se rellena el DataSet con datos a través del DataAdapter.
- Se cierra la conexión.
- Se trabaja con los datos almacenados en el DataSet.
Como
los conjuntos de datos se almacenan en memoria y trabaja con ellos de forma
desconectada, cuando hagamos cambios sobre ellos (inserciones, borrados o
actualizaciones) debemos actualizar el contenido de la base de datos llamando
al método Update del DataAdapter y, posteriormente, confirmar los cambios
realizados en el DataSet (con AcceptChanges) o deshacerlos (con RejectChanges).
No hay comentarios:
Publicar un comentario