UNIVERSIDAD NACIONAL DEL ALTIPLANO
ESCUELA PROFESIONAL:
INGENIERÍA DE SISTEMAS
TRABAJO DE INVESTIGACIÓN
DOCENTE:
ALDO HERNAN ZANABRIA GALVEZ
ALUMNA:
JHENERY ANYELA CARBAJAL PARI
SEMÁNTICA
INTRODUCCIÓN
La Semántica (del griego semantikos, lo que tiene significado), es el estudio del significado de los signos lingüísticos, esto es qué significan las palabras, expresiones y oraciones para los hablantes, cómo los designan (es decir, de qué forma se refieren a ideas y cosas), y por último, cómo los interpretan los oyentes.
Su finalidad es establecer lo que significan los signos dentro del proceso que asigna tales significados.
Se estudia desde una perspectiva filosófica, lingüística y así como desde un enfoque que se conoce por semántica general. El aspecto lingüístico, motivo de la importancia de este trabajo, estudia los elementos o los rasgos del significado y cómo se relacionan dentro del sistema lingüístico.
SEMANTICA
Se le llama semántica a la interpretación, el análisis y
correcto funcionamiento del sentido para usar las palabras, pero
también nos encontramos con una clasificación que nos muestra que la semántica
no solo es escrita, también el habla y la lectura forman parte
de este estudio, pues nos referimos a una herramienta de interpretación de
la comunicación, la escritura es un modo de comunicación formal, con la llegada
de los medios digitales de conversación este tipo se conexión se volvió las
versátil, dando paso a la creación de nuevos términos y modos de escribir, sin
embargo, la comunicación oral sigue siendo el modo de expresar y compartir
ideas mas usado, por lo que las personas necesitan de un método de comprensión
valido para poder comunicarse con facilidad.
Existe otro tipo de semántica, y es la semántica
lógica, la cual comprende un área donde se analiza la posición correcta
de signos de puntuación y tildes como representación de acentos y
formas de lectura.
La finalidad de la semántica es descomponer el
significado en unidades más pequeñas, llamadas semas o rasgos semánticos, estos
permiten segmentar el significado de las palabras, y diferenciar palabras de
significado parecido y palabras de significado opuesto.
En informática, la semántica
es considerada una aplicación de la matemática lógica. La semántica refleja el
significado de programas o funciones.
Los programas pueden separarse en su parte sintáctica (la
estructura gramatical) y su parte semántica (el significado). Por ejemplo, las
siguientes sentencias de programación utilizan diferentes sintaxis (en
diferentes lenguajes),
pero resultan en la misma semántica (hacen lo mismo):
1) x += y; (C, Java, etc)
2) x := x + y; (Pascal)
3) x = x + y (BASIC, Fortran)
En general, las tres operaciones lo que hacen (semántica)
es sumar Y con X y almacenar el resultado en X.
SEMÁNTICA «CODER»
El estudio de los lenguajes de programación es conocido
como la lingüística de la programación, por analogía con la filología. Esta
comparación se basa en el hecho en que ambas poseen sintaxis (forma) y
semántica (significado).
Definición de semántica aplicada a la programación:
Es el conjunto de reglas que proporcionan el significado
de una sentencia o instrucción de cualquier lenguaje de programación.
Obviamente estos lenguajes no pueden ser comparados con
ninguno que usemos para hablar, ya que han sido diseñados para ser implementados
en los ordenadores u otros dispositivos. No tienen la misma expresividad y
subjetividad.
En las 9 cosas más
difíciles que tienen que hacer los desarrolladores, el primer punto
se refiere a poner nombres. Para la mayoría de los programadores, elegir los
nombres de las variables, funciones, clases, objetos, etc., es lo más difícil.
Como desarrollador/a debes asumir la responsabilidad del
código que escribas y asegurarte que sea comprensible para los demás. Es lo que
te diferenciará del resto: tu profesionalidad.
Los nombres no sólo nos permiten identificar objetos,
sino que también pueden ayudar a describirlos. Hay que nombrar las cosas con el
fin de trabajar de manera eficiente y eficaz. Y el primer paso es reconocer que
tu código será visto por otros desarrolladores.
- Características de una buena semántica «coder»:
* Es comprensible
El aspecto más importante es el nombre sea comprensible.
Las palabras utilizadas en tu proyecto puede venir varias fuentes. Puedes
escribir para que sea ampliamente entendido o para que sólo lo reconozcan las
personas con las que trabajas en un proyecto.
* Es obvia
A veces el primer nombre que te viene a la cabeza puede ser
la mejor opción. No juegues con conceptos abstractos. A veces darle demasiada
vueltas a las cosas, empeoran el resultado.
* Es funcional
Tenemos que centrarnos en la función o el propósito, no
en la apariencia o el comportamiento. Es decir, ¿cuál es la función de un
componente y no cómo funciona el componente?
* Es consistente
Ser coherente en el enfoque de los nombres permitirá que
sea más fácil la denominación de los componentes sucesivos. Las jerarquías
deben ser predecibles.
* Es simple
Intenta evitar poner nombres largos. Sé eficiente. Por
ejemplo, intenta describir una función particular si es posible con una
palabra. Y cuidado con las abreviaturas, el contexto es importante.
* No debe depender de la cultura
Ten en cuenta que un término en España no tiene el mismo
significado en otros países. Intenta escribir de una forma estándar o
universal.
* Tiene personalidad
Picar código no tiene por qué ser aburrido, los nombres
pueden dar carácter a tu proyecto. Sé creativo pero sin perder de vista
los punto anteriores. Además puedes jugar según el tipo de producto que estés
desarrollando.
Semántica de los lenguajes de programación
La semántica de
un lenguaje de programación se refiere al significado que adoptan las distintas
sentencias, expresiones y enunciados de un programa. La semántica engloba
aspectos sensibles al contexto, a diferencia de la sintaxis que considera
aspectos libres de contexto.
Los principales elementos de la semántica son:
* Variables: se refieren a locaciones de memoria ligadas
a un nombre y a un tipo.
* Valores y referencias: los valores son el estado de
determinada celda o grupo de
celdas de la memoria,
mientras que las referencias indican la posición de esa celda en memoria.
Estos
2 conceptos están muy involucrados con los punteros. La mayoría de los
lenguajes los soportan, aunque son una conocida fuente de errores de
programación.
Expresiones: Son construcciones sintácticas que permiten
combinar valores con
operadores y producir nuevos valores.
Semántica estática.
* Gramática de atributos: Las gramáticas de atributos son más poderosas que las
BNF porque permiten formalizar aspectos sensibles al contexto.
Por ejemplo, el chequeo de tipos depende del contexto
porque debemos saber el tipo esperado y el actual y determinar si son
compatibles. El tipo esperado lo obtenemos del contexto analizando la
definición de la variable.
Si la variable num1 está definida de tipo String, y
más adelante le queremos asignar el valor 1000,
se producirá un error de tipo.
- La gramática de atributos de compone de:
* Atributos: o heredados: son los que se obtienen de un
elemento más general. Esquema de arriba hacia abajo.
Por ejemplo, number y
float. En este caso float heredará los atributos de number e incorporará nuevos
atributos propios de su tipo.
* Sintetizados: se conocen a partir de los sub- elementos,
como ser un subrango. Esquema de abajo hacia arriba, opuesto a los atributos
heredados.
* Intrínsecos: Estos atributos se obtienen de tablas
externas, fuera del árbol de derivación.
condiciones: Son hechos que se evalúan si suceden o no.
Por ejemplo, if(num>=20) ...
* reglas: A partir de un conjunto de condiciones se forman
las reglas.
Por ejemplo:
EJEMPLOS
Creo que la mejor forma más práctica de entender la
diferencia entre la semántica y la sintaxis en un lenguaje de programación (en
tu caso quieres que sea el lenguaje C) es definiendo los errores semánticos y
los errores sintácticos.
- Errores sintácticos: cuando existe código inválido que el compilador no entiende. Por ejemplo, intentas multiplicar una variable string (cadena) con un integer (entero) en C. El compilador lo detectará porque no puede compilarlo así. O cuando olvidas cerrar algún paréntesis o algún corchete, es un error sintáctico.
- Errores semánticos: el código de programación es válido porque el compilador lo entiende, pero el programa resultante no hace lo que el programador quiere que haga. No hay forma de que el compilador detecte estos errores.
Los errores semánticos son "errores lógicos", la lógica detrás del código escrito no hace lo que el programador cree que hará.
Te daré varios errores semánticos en C:
// Sumar uno 1 a la variable X
x -= 1;
En este caso estamos restándole 1 a la variable X.
// Sumar 1 a la variable X
y += 1;
En este caso estamos sumándole 1 a la variable Y (no a X, que es la que necesitamos).
// Actualizar todos los elementos de A
for (size_t i=1; i update(A[i]);
En este caso nos estamos olvidando de actualizar al arreglo A en su posición 0, es decir A[0], por lo que se trata de un error semántico.
Veamos un último ejemplo:
int CalcularArea( int ancho, int largo )
{
return ancho + largo;
}
En la función anterior, la sintaxis en C es correcta, pero hay un error semántico. En realidad para calcular el área del rectángulo se debería multiplicar en lugar de sumar.
- Errores sintácticos: cuando existe código inválido que el compilador no entiende. Por ejemplo, intentas multiplicar una variable string (cadena) con un integer (entero) en C. El compilador lo detectará porque no puede compilarlo así. O cuando olvidas cerrar algún paréntesis o algún corchete, es un error sintáctico.
- Errores semánticos: el código de programación es válido porque el compilador lo entiende, pero el programa resultante no hace lo que el programador quiere que haga. No hay forma de que el compilador detecte estos errores.
Los errores semánticos son "errores lógicos", la lógica detrás del código escrito no hace lo que el programador cree que hará.
Te daré varios errores semánticos en C:
// Sumar uno 1 a la variable X
x -= 1;
En este caso estamos restándole 1 a la variable X.
// Sumar 1 a la variable X
y += 1;
En este caso estamos sumándole 1 a la variable Y (no a X, que es la que necesitamos).
// Actualizar todos los elementos de A
for (size_t i=1; i update(A[i]);
En este caso nos estamos olvidando de actualizar al arreglo A en su posición 0, es decir A[0], por lo que se trata de un error semántico.
Veamos un último ejemplo:
int CalcularArea( int ancho, int largo )
{
return ancho + largo;
}
En la función anterior, la sintaxis en C es correcta, pero hay un error semántico. En realidad para calcular el área del rectángulo se debería multiplicar en lugar de sumar.
La web semántica
La web semántica propone superar las limitaciones de la
web actual mediante la introducción de descripciones explícitas del
significado, la estructura interna y la estructura global de los contenidos y
servicios disponibles en la WWW. Frente a la semántica implícita, el
crecimiento caótico de recursos, y la ausencia de una organización clara de la
web actual, la web semántica aboga por clasificar, dotar de estructura y anotar
los recursos con semántica explícita procesable por máquinas. La figura 2
ilustra esta propuesta. Actualmente la web se asemeja a un grafo formado por
nodos del mismo tipo, y arcos (hiperenlaces) igualmente indiferenciados. Por
ejemplo, no se hace distinción entre la página personal de un profesor y el
portal de una tienda on-line, como tampoco se distinguen explícitamente los
enlaces a las asignaturas que imparte un profesor de los enlaces a sus
publicaciones. Por el contrario en la web semántica cada nodo (recurso) tiene
un tipo (profesor, tienda, pintor, libro), y los arcos representan relaciones
explícitamente diferenciadas (pintor – obra, profesor – departamento, libro –
editorial).
La idea es que la web semántica esté formada (al menos en
parte) por una red de nodos tipificados e interconectados mediante clases y
relaciones definidas por una ontología compartida por sus distintos autores.
Por ejemplo, una vez establecida una ontología sobre cuadros y pintura, un
museo virtual puede organizar sus contenidos definiendo instancias de pintores,
cuadros, etc., interrelacionándolas y publicándolas en la web semántica. La
adopción de ontologías comunes es clave para que todos los que participen de la
web semántica, contribuyendo o consumiendo recursos, puedan trabajar de forma
autónoma con la garantía de que las piezas encajen. Así por ejemplo varios
museos podrían colaborar para dar lugar a un gran meta-museo que integre los
contenidos de todos ellos. Un programa que navegue por una red como ésta puede
reconocer las distintas unidades de información, obtener datos específicos o
razonar sobre relaciones complejas. A partir de aquí sí podemos distinguir
entre un cuadro pintado por un artista y un retrato de un artista.
De la web actual a la web semántica
Llegados a este
punto una pregunta importante a responder es cómo encaja la web semántica con
la actual, es decir a) cómo accederá el usuario a la web semántica, y sobre
todo, b) cómo hacer la transición de la web actual a la web semántica. Para que
la web semántica pueda realizarse es importante que guarde, al menos al
principio, una compatibilidad con la tecnología actual. Es deseable por ejemplo
mantener HTML (u otros lenguajes compatibles con los navegadores actuales) como
vehículo de comunicación con el usuario. La asociación entre las instancias de
la web semántica y el código HTML se puede establecer de distintas maneras (ver
figura 3). Una consiste en conservar los documentos actuales, y crear las
instancias asociadas anotando su correspondencia con los documentos (imagen
izquierda en la figura 3). Esta posibilidad es la más viable cuando se parte de
un gran volumen de material antiguo. Otra es generar dinámicamente páginas web
a partir de las ontologías y sus instancias (imagen derecha). Esta última
opción puede resultar factible cuando los documentos antiguos ya se estaban
generando automáticamente a partir, por ejemplo, de una base de datos.Programación en Lógica
Como sabemos, existen diversas alternativas
para capturar la semántica de los programas
lógicos, a saber:
Semántica Operacional
Semántica Declarativa
Semántica de Punto Fijo
La Semántica Operacional fue introducida en
clases anteriores.
En la clase de hoy, abordaremos la Semántica
Declarativa.
3
Semántica Declarativa
La Semántica Declarativa se basa en la simple
idea de interpretar/considerar a un programa
lógico como lo que es:
un conjunto de fbfs (cláusulas),
expresadas en una determinada teoría formal.
Bajo esta nueva óptica, se pueden aplicar los
familiares conceptos de interpretación y de
modelo a programas lógicos.
BIBLIOGRAFIA
http://conceptodefinicion.de/semantica/
https://www.significados.com/semantica/
http://www.alegsa.com.ar/Diccionario/C/611.php
http://www.alegsa.com.ar/Diccionario/C/25059.php
https://geekytheory.com/semantica-coder
http://www.monografias.com/trabajos-pdf/lenguajes-programacion/lenguajes-programacion2.shtml
http://arantxa.ii.uam.es/~castells/publications/castells-uclm03.pdf
http://cs.uns.edu.ar/~grs/Logica/007-2009.Semantica%20Declarativa.Color.pdf
CONCURRENCIA
Concurrencia se refiere al hecho de que los Sistemas Administradores
de Base de Datos permiten que muchas transacciones accedan a una misma Base de Datos
a la vez. Cuando existen varios usuarios intentando modificar los datos al mismo
tiempo, se necesita establecer algún tipo de control para que dichas modificaciones
de un usuario no interfieran en las de los otros, a este sistema se le denomina
control de concurrencia.
DEFINICIÓN
DE CONCURRENCIA
En el campo informatico, el termino concurrencia
se refiere a la capacidad de los Sistemas de Administración de Base de Datos,
de permitir que múltiples procesos sean ejecutados al mismo tiempo, y que
tambien puedan interactuar entre sí.
Los procesos concurrentes pueden ser ejecutados realmente de forma
simultánea, sólo cuando cada uno es ejecutado en diferentes procesadores. En
cambio, la concurrencia es simulada si sólo existe un procesador encargado de
ejecutar todos los procesos, simulando
la concurrencia, ocupándose de forma alternada de uno y otro proceso a muy
pequeños intervalos de tiempo. De esta manera simula que se están ejecutando a
la vez.
Algunos casos de concurrencia, pueden ser:
● La multiprogramación, ya que el tiempo del procesador es compartido
dinámicamente por varios procesos.
● Las aplicaciones estructuradas, donde la programación estructurada se
implementa como un conjunto de procesos concurrentes.
● También se tiene que la misma estructura recién mencionada es utilizada
en el diseño de los sistemas operativos, los cuales se implementan como un
conjunto de procesos.
Debido a que los procesos concurrentes en un sistema pueden interactuar entre otros también en ejecución, el número de caminos de ejecución puede ser extremadamente grande, resultando en un comportamiento sumamente complejo. Las dificultades asociadas a la concurrencia han sido pensadas para el desarrollo de lenguajes de programación y conceptos que permitan hacer la concurrencia más manejable.
TRANSACCIONES
El
concepto principal es el de transacción. Informalmente, una transacción es la
ejecución de ciertas instrucciones que acceden a una base de datos compartida.
El objetivo del control de concurrencia y recuperación es asegurar que dichas
transacciones se ejecuten atómicamente, es decir:
Cada
transacción accede a información compartida sin interferir con otras
transacciones, y si una transacción termina normalmente, todos sus efectos son
permanentes, en caso contrario no tiene afecto alguno.
Una base
de datos está en un estado consistente si obedece todas las restricciones de
integridad (significa que cuando un registro en una tabla haga referencia a un
registro en otra tabla, el registro correspondientes debe existir) definidas
sobre ella.
PROBLEMAS DE CONCURRENCIA
Existen tres formas en las que una transacción, aunque sea correcta por
sí misma, puede producir una respuesta incorrecta si alguna otra transacción
interfiere con ella en alguna forma.
Consideremos que la transacción que interfiere también puede ser
correcta; lo que produce el resultado incorrecto general es el intercalado sin
control entre las operaciones de las dos transacciones correctas.
Los tres problemas son:
● El problema de la Actualización Perdida
● El problema de la
Dependencia No Confirmada
● El problema del Análisis Inconsistente
Veamos algunos ejemplos para entender cómo es
que los programas pueden interferir con otros. Tomaremos como ejemplo las
transacciones de las cuentas de un banco, supongamos que tenemos un programa
llamado Depositar, el cual deposita dinero en una cuenta.
Procedure
Depositar(Cuenta, Monto)
begin
Start;
temp := Leer(Cuentas[Cuenta]);
temp := temp + Monto;
Escribir(Cuentas[Cuenta],temp);
Commit;
end
Supongamos que la cuenta 7 tiene un saldo
de $1000 y que el cliente 1 deposita $100 en la cuenta 7
en el mismo instante en el que el cliente 2 deposita $100000 en
la cuenta 7. Cada uno de los clientes llama al procedimiento Depositar
de tal manera que se crea una transacción para realizar su actualización. La
ejecución concurrente de éstos depósitos produce una secuencia de lecturas y
escrituras en la base de datos, tales como
Leer1(Cuentas[7]) devuelve el valor de $1000
Leer2(Cuentas[7]) devuelve el valor de $1000
Escribir2(Cuentas[7], $101000)
Commit2
Escribir1(Cuentas[7], $1100)
Commit1
El resultado de esta ejecución es que la Cuenta [7] contiene $1100.
A pesar que el depósito del cliente 2 concluyó satisfactoriamente, la
interferencia con la ejecución de Depósito del cliente 1 causó que el
depósito del cliente 2 se pierda. Este fenónemo de actualización
perdida ocurre cuando dos transacciones, mientras intentan modificar un
dato, ambas leen el valor antiguo del elemento antes que ninguna haya
modificado su valor.
Otro problema del control de concurrencia se
ilustra con el siguiente programa, llamado ImprimirSuma, el cual imprime la
suma de los saldos de dos cuentas.
Procedure
ImprimirSuma(Cuenta1, Cuenta2)
begin
Start;
temp1 := Leer(Cuentas[Cuenta1]);
output(temp1);
temp2 := Leer(Cuentas[Cuenta2]);
output(temp2);
temp1 := temp1 $+$ temp2;
output(temp1);
Commit;
end
Supongamos que las cuentas 8 y 9
tiene un saldo de $200 cada una, y que el cliente 3 imprime los
saldos de las cuentas 8 y 9 (utilizando ImprimirSuma) en el mismo
instante en el que el cliente 4 transfiere $100 de la cuenta 8 a la cuenta 9
(utilizando Transferir). La ejecución concurrente de estas dos transacciones
puede originar la siguiente ejecución de operaciones de la base de datos.
Leer4(Cuentas[8]) devuelve el valor de $200
Escribir4(Cuentas[8], $100)
Leer3 (Cuentas[8]) devuelve el valor de $100
Leer3 (Cuentas[9]) devuelve el valor de $200
Leer4 (Cuentas[9]) devuelve el valor de $200
Escribir4 (Cuentas[9], $300)
Commit4
Commit3
El procedimiento Transferir interfiere con
ImprimirSuma en esta ejecución, causando que ImprimirSuma imprima el valor de $300,
la cual no es la suma correcta de los saldos de las cuentas 8 y 9.
El procedimiento ImprimirSuma no capturó los $100 en tránsito de la
cuenta 8 a
la cuenta 9. Es importante recalcar que, a pesar de la interferencia,
Transferir todavíia asigna los valores correctos en la base de datos.
Este tipo de interferencia se denomina análisis
inconsistente que ocurre cuando una transacción lee un dato antes que
otra transacción lo actualice y lea otro dato después que la misma transacción
lo ha actualizado. Es decir, la extracción (lectura) de los datos sólo percibe
algunos de los resultados de la transacción de actualización.
Para conseguir el objetivo del control de
concurrencia se utiliza un sincronizador. Un sincronizador es un programa (o
una colección de ellos) que controla la ejecución concurrente de las
transacciones; su función radica en ordenar las operaciones que forman parte de
las transacciones que se requieren ejecutar concurrentemente, de tal manera que
la ejecución resultante sea correcta. Usando tres operaciones básicas
(ejecución, rechazo y retraso de una operación) el sincronizador puede
controlar el orden en el cual las operaciones son ejecutadas por el
Administrador de Datos.. Cuando éste recibe una operación de la transacción
(mediante el TM), usualmente trata de pasarla al DM inmediatamente, si no
produce alguna ejecución incorrecta. Si el sincronizador decide que la
ejecución de la operación puede producir resultados incorrectos, puede o
retrasarla (en caso de que pueda procesar correctamente la operación más
adelante) o rechazarla (si no es posible procesarla en el futuro de tal manera
que produzca resultados correctos).
Por ejemplo, retomemos la ejecución concurrente
de dos transacciones Depositar, que depositan $100 y $100,000 en
la cuenta 7
Leer1 (Cuentas[7]) devuelve el valor de $1000
Leer2 (Cuentas[7]) devuelve el valor de $1000
Escribir2 (Cuentas[7], $101000)
Commit2
Escribir1(Cuentas[7], $1100)
Commit1
Para evitar esta ejecución incorrecta, un
sincronizador debe decidir rechazar Escribir1 provocando que la transacción T1
sea cancelada. En este caso, el usuario o el Administrador de Transacciones
puede reenviar T1 , la cual ahora se puede ejecutar sin interferir con T2. Como
otra alternativa, el sincronizador puede prevenir la ejecución anterior
retrasando Leer2 hasta que reciba y procese Escribir1 y de esta forma evitando
que se rechace Escribir1 más adelante.
Por lo tanto, un DBMS que controla la ejecución
concurrente de sus transacciones tiene una estructura como la siguiente :
CONTROL DE CONCURRENCIA EN BASES DE DATOS
En los ejemplos anteriores, los errores fueron
causados por la ejecución intercalada de operaciones de transacciones
diferentes. Los ejemplos no muestran todas las posibles formas en las que la
ejecución de dos transacciones pueden interferir, pero sí ilustran dos de los
problemas que surgen con frecuencia debido a la intercalación. Para evitar
estos problemas, se deben controlar las intercalaciones entre transacciones.
El control de transacciones concurrentes en una base de datos brinda un
eficiente desempeño del Sistema de Administración de Base de Datos, puesto que
permite controlar la ejecución de transacciones que operan en paralelo,
accediendo a información compartida y, por lo tanto, interfiriendo
potencialmente unas con otras.
El objetivo de los métodos de control de concurrencia es garantizar la
no inferencia o la propiedad de aislamiento de transacciones que se ejecutan de
manera concurrente. Los distintos objetivos atacan el problema garantizando que
las transacciones se ejecuten en un plan que sea serializable, es decir, que el
resultado sea equivalente a el resultante de ejecutar un plan en serie.
CONCLUSIÓN
El control de concurrencias permite mejorar la calidad de funcionamiento de de las
aplicaciones, incluso hacen posible que se puedan realizar muchos de
los sistemas existentes, lo que sin la existencia de estos controles no serian
factibles de realizar.
El correcto control de concurrencias permite
además mantener información consistente en las bases de datos, así como también
evita la aparición de errores en las recuperaciones y o respaldos que se realicen de una base de
datos.
De esta
manera, los sistemas de control de concurrencia deben garantizar la
consistencia de la información en la
Base de Datos.
BIBLIOGRAFIA
http://www.lsi.us.es/docencia/get.php?id=4559
http://es.wikipedia.org/wiki/Bases_de_datos_distribuidas
http://es.wikipedia.org/wiki/Bases_de_datos_distribuidas







