Hola. Te voy a poner un ejemplillo de cada cosa, usando como base de datos PostgreSQL. Como es muy probable que exista algún error en el texto, se admiten correcciones ;)
Integridad referencial: Imaginemos que tenemos una tabla "clientes" con dos columnas, "id_cliente" y "nombre", por ejemplo. Podríamos crear otra tabla llamada "dni_clientes", con dos columnas, "id_cliente" y "dni". La columna "id_cliente" de "dni_clientes" la crearíamos como una clave ajena (foreign key) que apunta a la columna con el mismo nombre (aunque no tendría por qué) de la tabla "clientes". Crearíamos la segunda tabla así:
Por mantener la integridad referencial entiendo que es mantener la correspondencia de las claves ajenas entre las tablas.
Vistas: Se usan para consultas complejas, y son como una forma de encapsular consultas. Ejemplo:
create view mi_vista as
select nombre,dni from clientes, dni_clientes
where clientes.id_cliente=dni_clientes.id_cliente
Podríamos hacer una consulta sobre esa vista, como si se tratase de una tabla. Ejemplo:
select nombre,dni from mi_vista where nombre="pepe";
En este caso no sería muy útil ya que podríamos haber obtenido los mismos resultados sin recurrir a una vista, pero es sólo un ejemplo :)
Procedimientos almacenados: son procedimientos escritos en un lenguaje determinado que se almacenan en la base de datos. En Oracle el lenguaje es PL/SQL, en PostgreSQL es PLPG/SQL. Ejemplo de una función en PLPG/SQL:
create function nuevo_cliente(integer,integer,varchar)
returns integer as '
declare
par_id_cliente alias for $1;
par_dni alias for $2;
par_nombre alias for $3;
begin
insert into clientes
(id_cliente,nombre)
values
(par_id_cliente,par_nombre);
insert into dni_clientes
(id_cliente,dni)
values
(par_id_cliente,par_dni);
return id_cliente;
end;' language 'plpgsql';
Después, para usarla haríamos algo como:
select nuevo_cliente('8','92389924','pepe');
Eso introduciría un nuevo cliente en las tablas "clientes" y "dni_clientes".
Subconsultas: Creo que se refiere a esto:
select dni from (select id_cliente,dni,nombre from clientes,dni_clientes where clientes.id_cliente=dni_clientes.id_cliente) where id_cliente>6;
Aunque también puede referirse a esto:
select id_cliente,dni,(select id_cliente as id_cliente2,nombre from nombres)
where id_cliente=id_cliente2;
Como ves, la presencia de estas funcionalidades en una base de datos multiplica (y por un factor elevado) el número de posibilidades a la hora de realizar operaciones con la base de datos.
Si quieres aprender bien estas cosas (y muchas otras que desconocerás si sólo has usado MySQL) de forma amena y sin leer tropecientos manuales, te recomiendo el libro online SQL for web nerds [greenspun.com], de Philip Greenspun. Parte de ejemplos básicos y va complicando las consultas, introduciendo los nuevos conceptos necesarios para realizarlas. Creo recordar que los ejemplos de código están hechos para Oracle, pero para coger el concepto es más que de sobra, luego sólo cambia la sintaxis.
saludos
--
You laugh at me because I am different, I laugh at you because you are all the same
por
pobrecito hablador
el Domingo, 18 Enero de 2004, 09:41h
(#255203)
Académica explicación, sí señor.
Nada que añadir, excepto si cabe, una aclaración para los menos "avanzados":
"Por mantener la integridad referencial entiendo que es mantener la correspondencia de las claves ajenas entre las tablas.", significa que la cualquier acción sobre el campo id_cliente de la tabla clientes o bien se propagará a las tablas relacionadas (dni_clientes) o simplemente el gestor de bases de datos la capará (impedirá que se realice).
En la práctica, la sentencia
delete from clientes where id_cliente = 3
Dará un error si en la tabla dni_clientes existe un registro con id_cliente=3
En el caso de un update, (cosa rara hacer un update de un identificador de registro, pero sirve para el ejemplo) en la mayoría de casos también daría un error, pero en otros casos se puede propagar el cambio (cambiar el id_cliente de todos los registros de dni_clientes que se correspondan con el cliente actualizado)
Hasta ahora las foreign keys solo las usaba en CREATE, a no ser que usaras InnoDB, ( yo siempre he usado MYiSAM, por el tipo de aplicaciones que suelo hacer. De todas maneras por lo que he visto, tampoco son funcionalidades que añadan algo muy diferente. Por lo que he visto, no hay nada que ahora se pudiera hacer y antes no, quizá ahora más cómodamente. Lo que si me ha sorprendido ha sido leer por ahi en un sitio de SQL server que es mejor no usar cursores [sql-server...rmance.com], que son muy ineficientes.
Sin "stored procedures" creo que también podía vivir, será algo más eficiente tenerlas en el servidor, pero tampoco añaden funcionalidad que no puedas poner tú en tu código.
Realmente, ¿Qué tienen otras bd afamadas como más potentes como Oracle, que no puedas hacer con mysql o Posgres?
Re:Features avanzadas
(Puntos:5, Interesante)( http://barrapunto.com/ )
Integridad referencial: Imaginemos que tenemos una tabla "clientes" con dos columnas, "id_cliente" y "nombre", por ejemplo. Podríamos crear otra tabla llamada "dni_clientes", con dos columnas, "id_cliente" y "dni". La columna "id_cliente" de "dni_clientes" la crearíamos como una clave ajena (foreign key) que apunta a la columna con el mismo nombre (aunque no tendría por qué) de la tabla "clientes". Crearíamos la segunda tabla así:
Por mantener la integridad referencial entiendo que es mantener la correspondencia de las claves ajenas entre las tablas.
Vistas: Se usan para consultas complejas, y son como una forma de encapsular consultas. Ejemplo:
Podríamos hacer una consulta sobre esa vista, como si se tratase de una tabla. Ejemplo:
En este caso no sería muy útil ya que podríamos haber obtenido los mismos resultados sin recurrir a una vista, pero es sólo un ejemplo :)
Procedimientos almacenados: son procedimientos escritos en un lenguaje determinado que se almacenan en la base de datos. En Oracle el lenguaje es PL/SQL, en PostgreSQL es PLPG/SQL. Ejemplo de una función en PLPG/SQL:
Después, para usarla haríamos algo como:
Eso introduciría un nuevo cliente en las tablas "clientes" y "dni_clientes".
Subconsultas: Creo que se refiere a esto:
Aunque también puede referirse a esto:
Como ves, la presencia de estas funcionalidades en una base de datos multiplica (y por un factor elevado) el número de posibilidades a la hora de realizar operaciones con la base de datos.
Si quieres aprender bien estas cosas (y muchas otras que desconocerás si sólo has usado MySQL) de forma amena y sin leer tropecientos manuales, te recomiendo el libro online SQL for web nerds [greenspun.com], de Philip Greenspun. Parte de ejemplos básicos y va complicando las consultas, introduciendo los nuevos conceptos necesarios para realizarlas. Creo recordar que los ejemplos de código están hechos para Oracle, pero para coger el concepto es más que de sobra, luego sólo cambia la sintaxis.
saludos
You laugh at me because I am different, I laugh at you because you are all the same
Re:Features avanzadas
(Puntos:2)( http://barrapunto.com/ )
You laugh at me because I am different, I laugh at you because you are all the same
Re:Features avanzadas
(Puntos:2, Informativo)Académica explicación, sí señor.
Nada que añadir, excepto si cabe, una aclaración para los menos "avanzados":
"Por mantener la integridad referencial entiendo que es mantener la correspondencia de las claves ajenas entre las tablas.", significa que la cualquier acción sobre el campo id_cliente de la tabla clientes o bien se propagará a las tablas relacionadas (dni_clientes) o simplemente el gestor de bases de datos la capará (impedirá que se realice).
En la práctica, la sentencia
delete from clientes where id_cliente = 3
Dará un error si en la tabla dni_clientes existe un registro con id_cliente=3
En el caso de un update, (cosa rara hacer un update de un identificador de registro, pero sirve para el ejemplo) en la mayoría de casos también daría un error, pero en otros casos se puede propagar el cambio (cambiar el id_cliente de todos los registros de dni_clientes que se correspondan con el cliente actualizado)
Espero no haber liado más las cosas ;-)Re:Features avanzadas
(Puntos:2)( http://www.lartc.org | Última bitácora: Viernes, 06 Agosto de 2004, 13:07h )
Sin "stored procedures" creo que también podía vivir, será algo más eficiente tenerlas en el servidor, pero tampoco añaden funcionalidad que no puedas poner tú en tu código.
Realmente, ¿Qué tienen otras bd afamadas como más potentes como Oracle, que no puedas hacer con mysql o Posgres?