# Amazon SimpleDB

Amazon SimpleDB es una base de datos distribuida escrita en Erlang por Amazon.com. Se utiliza como servicio web junto con Amazon Elastic Compute Cloud (EC2) y Amazon S3 y forma parte de Amazon Web Services. Se anunció el 13 de diciembre de 2007.
Al igual que EC2 y S3, Amazon cobra tarifas por el almacenamiento, la transferencia y el rendimiento de SimpleDB a través de Internet. El 1 de diciembre de 2008, Amazon introdujo un nuevo precio con para la sección gratuita para 1 GB de datos y 25 de horas máquina. La transferencia a otros servicios Amazon Web Service es gratuita.

## Limitaciones

SimpleDB proporciona consistencia eventual, que es una forma más débil de consistencia, en comparación con otros sistemas de administración de bases de datos. Esto a menudo se considera una limitación, porque es más difícil razonar, lo que dificulta escribir programas correctos que utilicen SimpleDB. Esta limitación es el resultado de una compensación de diseño fundamental. Al renunciar a la consistencia, el sistema puede lograr otras dos características altamente deseables:
* Disponibilidad: los componentes del sistema pueden fallar, pero el servicio seguirá funcionando correctamente.
* Tolerancia de partición: los componentes del sistema están conectados entre sí mediante una red informática. Si los componentes no pueden comunicarse entre sí mediante la red (una condición conocida como partición de red), la operación del sistema continuará.
Se supone que las fallas de los componentes son inevitables; por lo tanto, ambas características se consideraron necesarias para brindar un servicio web confiable. El teorema CAP establece que no es posible que un sistema exhiba estas propiedades junto con la consistencia; por lo tanto, los diseñadores necesitaban conformarse con una forma más débil de consistencia.
Limitaciones publicadas:

### Limitaciones de la tienda

| Atributo | Máximo |
| dominios | 250 dominios activos por cuenta. Se puede solicitar más completando un formulario. |
| tamaño de cada dominio | 10GB |
| atributos por dominio | 1,000,000,000 |
| atributos por artículo | 256 atributos |
| tamaño por atributo | 1024 bytes |

### Limitaciones de consulta

| Atributo | Máximo |
| elementos devueltos en una respuesta de consulta | 2500 artículos |
| segundos puede ejecutarse una consulta | 5 segundos |
| nombres de atributo por predicado de consulta | 1 nombre de atributo |
| comparaciones por predicado | 22 operadores |
| predicados por expresión de consulta | 20 predicados |

## Características

La colocación condicional y la eliminación condicional son operaciones nuevas que se agregaron en febrero de 2010. Abordan un problema que surge al acceder a SimpleDB al mismo tiempo. Considere un programa simple que usa SimpleDB para almacenar un contador, es decir, un número que se puede incrementar. El programa debe hacer tres cosas:
* Recuperar el valor actual del contador de SimpleDB.
* Sumar uno al valor.
* Almacenar el valor nuevo en el mismo lugar que el valor anterior en SimpleDB.
Si este programa se ejecuta mientras ningún otro programa accede a SimpleDB, funcionará correctamente; sin embargo, a menudo es deseable que las aplicaciones de software (particularmente las aplicaciones web) accedan a los mismos datos al mismo tiempo. Cuando se accede a los mismos datos al mismo tiempo, surge una condición de carrera, lo que daría como resultado una pérdida de datos indetectable.
Continuando con el ejemplo anterior, considere dos procesos, A y B, ejecutando el mismo programa. Supongamos que las solicitudes de datos de servicios de SimpleDB, como se describe en el paso 1, de A y B. A y B ven el mismo valor. Digamos que el valor actual del contador es 0. Debido a los pasos 2 y 3, A intentará almacenar 1. B intentará hacer lo mismo; por lo tanto, el valor final del contador será 1, aunque el valor final esperado del contador sea 2, porque el sistema intentó dos operaciones de incremento, una por A y otra por B.
Este problema se puede resolver mediante el uso de put condicional. Supongamos que cambiamos el paso 3 de la siguiente manera: en lugar de almacenar incondicionalmente el nuevo valor, el programa le pide a SimpleDB que almacene el nuevo valor solo si el valor que contiene actualmente es el mismo que el valor que se recuperó en el paso 1. Entonces, podemos estar seguros de que el valor del contador realmente aumenta. Esto introduce cierta complejidad adicional; si SimpleDB no pudo almacenar el nuevo valor porque el valor actual no era el esperado, el programa debe repetir los pasos 1 a 3 hasta que la operación de colocación condicional realmente cambie el valor almacenado.

### Lectura consistente

La lectura consistente fue una característica nueva que se lanzó al mismo tiempo que la colocación condicional y la eliminación condicional. Como sugiere el nombre, la lectura coherente aborda los problemas que surgen debido al modelo de coherencia eventual de SimpleDB. Considere la siguiente secuencia de operaciones:
* El programa A almacena algunos datos en SimpleDB.
* Inmediatamente después, A solicita los datos que acaba de almacenar.
La garantía de consistencia eventual de SimpleDB no nos permite decir que los datos recuperados en el paso 2 reflejan las actualizaciones que se realizaron en el paso 1. La coherencia eventual solo garantiza que el paso 2 refleje el conjunto completo de actualizaciones del paso 1, o ninguna de esas actualizaciones. La lectura coherente se puede utilizar para garantizar que los datos recuperados en el paso 2 reflejen los cambios en el paso 1.
La razón por la que pueden surgir resultados incoherentes cuando no se utiliza la operación de lectura coherente es que SimpleDB almacena datos en varias ubicaciones (para disponibilidad), y es posible que los nuevos datos del paso 1 no se escriban en todas las ubicaciones cuando SimpleDB recibe la solicitud de datos en el paso 2. En ese caso, es posible que la solicitud de datos en el paso 2 se atienda en una de las ubicaciones donde no se han escrito los nuevos datos.
Amazon desaconseja el uso de lectura consistente, a menos que sea necesario para la corrección. El motivo de esta recomendación es que la velocidad a la que se atienden las operaciones de lectura coherentes es inferior a la de las lecturas normales.

## Relación con DynamoDB

Se ha hablado de la sustitución de SimpleDB por DynamoDB (ya no se "itera", aunque Amazon no planea eliminarlo). DynamoDB parece ser su sucesor.