2009-06-11 10 views
10

Estoy en proceso de crear una aplicación móvil (iPhone/Android) y quiero almacenar los datos de la aplicación en SimpleDB de Amazon, porque no queremos alojar nuestro propio servidor para proporcionar estos servicios . He estado revisando toda la documentación y el tamaño máximo de almacenamiento de los valores de los elementos es 1024 bytes.tamaño máximo de atributos en AWS SimpleDB

En mi caso, necesitamos almacenar 1024 hasta 10K de datos de texto.

Tenía la esperanza de descubrir cómo otros proyectos usan SimpleDB cuando tienen necesidades de almacenamiento más grandes, como nuestro proyecto. Leí que uno podía almacenar punteros en archivos que luego se almacenan en S3 (sistema de archivos). No estoy seguro si esa es una buena solución.

En mi opinión, no estoy seguro de si SimpleDB es la solución correcta. ¿Alguien podría comentar sobre lo que ha hecho o proporcionar una forma diferente de pensar acerca de este problema?

+0

¿Cuáles son sus requisitos para recuperar los datos? ¿Tienes que buscar en él, separarlo por campos, etc.? – Mark

+0

Solo necesito mostrar los datos de texto. Planeo etiquetar estos datos para poder consultarlos y mostrar al usuario el texto que tiene más de 1024 bytes. Supongo que tendré información de ciudad/estado/descripción y uno consultaría contra la ciudad y el estado y mostraría la descripción al usuario. –

+0

Esto suena como un gran uso para SimpleDB. Solo necesita agregar una rutina para dividir el texto cuando almacena el elemento, y otro para volver a armarlo a partir de sus resultados seleccionados. "SELECT desc FROM Domain001 donde city =? INTERSECTION state =?" – Mocky

Respuesta

14

Hay formas de almacenar sus datos de texto de 10k pero si será aceptable dependerá de qué más necesite almacenar y cómo planea usarlo.

Si necesita almacenar datos arbitrariamente grandes (especialmente datos binarios), entonces el puntero del archivo S3 puede ser atractivo. El valor que SimpleDB agrega en este escenario es la capacidad de ejecutar consultas en contra de los metadatos del archivo que usted almacena en SimpleDB.

Para datos de texto limitados a 10k, recomendaría almacenarlos directamente en SimpleDB. Encajará fácilmente en un solo elemento, pero tendrá que extenderlo a través de múltiples atributos. Básicamente hay dos formas de hacer esto, cada una con algunos inconvenientes.

Una forma es más flexible y fácil de buscar pero requiere que toque sus datos. Divides tus datos en fragmentos de aproximadamente 1000 bytes y almacenas cada fragmento como un valor de atributo en un atributo de varios valores. No hay ordenamiento impuesto en atributos multivalor, por lo que debe anteponer cada fragmento con un número para ordenar (por ej. 01)

El hecho de tener todo el texto almacenado en un atributo hace que las consultas sean fáciles de hacer con un solo nombre de atributo en el predicado. Puede agregar un texto de diferente tamaño a cada elemento desde 1k hasta 200 + k y se maneja adecuadamente. Pero debe tener en cuenta que sus números de línea antepuestos pueden aparecer positivos para sus consultas (por ejemplo, si está buscando 01, cada elemento coincidirá con esa consulta).

La segunda forma de almacenar el texto dentro de SimpleDB no requiere que coloque datos de ordenamiento arbitrarios dentro de los fragmentos de texto. Usted hace el pedido colocando cada fragmento de texto en un atributo con nombre diferente. Por ejemplo, podría usar nombres de atributos: desc01desc02 ... desc10. Luego colocas cada pedazo en el atributo apropiado. Todavía puede hacer una búsqueda de texto completo con ambos métodos, pero las búsquedas serán más lentas con este método porque necesitará especificar muchos predicados y SimpleDB terminará buscando a través de un índice separado para cada atributo.

Puede ser fácil pensar en este tipo de trabajo como un truco porque con las bases de datos estamos acostumbrados a que este tipo de detalles de bajo nivel se manejen para nosotros dentro de la base de datos. SimpleDB está específicamente diseñado para llevar este tipo de cosas fuera de la base de datos y al cliente como un medio para proporcionar disponibilidad como una característica de primera clase.

Si descubrió que una base de datos relacional estaba dividiendo su texto en 1k fragmentos para almacenar en el disco como un detalle de implementación, no parecería un hack. El problema es que el estado actual de los clientes SimpleDB es tal que tiene que implementar mucho de este tipo de formato de datos usted mismo. Este es el tipo de cosa que idealmente se manejará para usted en un cliente inteligente.Simplemente no hay clientes inteligentes disponibles de forma gratuita todavía.

+0

Tenía una pequeña respuesta escrita y estaba a punto de enviarse cuando Mocky publicó esta. Gran suma, estoy completamente de acuerdo con eso. Dada la velocidad y el precio de SimpleDB, definitivamente vale la pena intentarlo. Especialmente cuando empiezas a darte cuenta de que las limitaciones de un DB tradicional ya no se aplican. – Mark

+0

Sí, excelente respuesta, gracias por eso. Romper los datos requerirá mucho más reflexión y trabajo de mi parte, pero creo que será más fácil que alojar una base de datos y un servidor. gracias. –

1

Si le preocupa el costo, puede encontrar que es más barato poner el texto en S3 y los metadatos con punteros en SimpleDB.

+0

Esta es la técnica que estoy buscando usar. Bueno para nuevas empresas. –

0

La próxima versión de Simple Savant (una biblioteca de persistencia C# para SimpleDB que he creado) admitirá la extensión de atributos como se describe en Mocky y las búsquedas de texto completo de datos SimpleDB usando Lucene.NET.

Me doy cuenta de que probablemente no esté compilando su aplicación en C#, pero dado que su pregunta es un resultado superior al buscar SimpleDB y la indexación de texto completo, parece digno de mención.

ACTUALIZACIÓN: La versión de Simple Savant que mencioné anteriormente ya está disponible.

+0

Eso es perfecto, esto es lo que necesito porque no puedo hacer la gestión en mi propio código. –

1

Puede poner el texto de 10k en S3, luego crear un atributo que tenga todas las palabras únicas de los 10k de texto como valores múltiples. Entonces las búsquedas serían rápidas. Sin embargo, no hay búsqueda de frases.

¿Cuántos valores puede almacenar en un atributo en una 'fila' (nombre)? Miré en los documentos, ninguna respuesta apareció en mí.

--Tom

+1

Ok - Lo descubrí. Para hacer búsquedas de solo palabras en simpleDB, cree un conjunto de todas las palabras únicas (minúsculas) y cargue tantas palabras como correspondan en 1024 bytes por atributo. por 10k de texto típico inglés que podría sumar 3 o 4 atributos. A continuación, almacene el texto real en s3, con la clave almacenada en simpleDB. Obtiene 256 pares de valor de atributo por artículo con simpleDB. –

+0

Enfoque interesante. –

0

SimpleDb es, bueno, simple. Todo en ella es una cadena. La documentación es muy directa. Y hay muchas restricciones de uso. Tales como:

  • Sólo se puede hacer una SELECT * FROM ___ WHERE ItemName() IN (...) con 20 ItemName s en el IN.
  • Solo puede PUT (actualizar) a 25 registros a la vez.
  • Todas las lecturas se basan en el tiempo de cálculo. Entonces, si hace un SELECT con un LIMIT de 1000, puede devolver algo como 800 (o incluso nada) junto con un nextToken en el cual necesita hacer una solicitud adicional (con el nextToken). Esto significa que el siguiente SELECT puede devolver el conteo de límite, por lo que la suma de las filas devueltas de los dos SELECT s puede ser mayor que su límite original. Esto es una preocupación si está seleccionando mucho. Además, si haces un SELECT COUNT(*), tendrás un problema similar. Te devolverá un conteo, junto con un nextToken. Y necesita seguir iterando sobre esos nextToken sy sumar los conteos regresivos para obtener el conteo verdadero (total).
  • Todos estos tiempos de cálculo se verán afectados en gran medida por los datos más grandes en la tienda.
  • Si al final tener un gran número de registros es probable que tenga en Shard sus archivos a través de múltiples dominios
  • Amazon va a estrangular a sus peticiones si haces demasiados en un único dominio

lo tanto, si planea usar grandes cantidades de datos de cadena, o tiene muchos registros, entonces es posible que desee buscar en otra parte. SimpleDb es muy confiable y funciona como está documentado, pero puede causar muchos dolores de cabeza.

En su caso, recomendaría algo como MongoDb. También tiene su parte de problemas, pero puede ser mejor para este caso. Sin embargo, si tiene muchos registros (millones y más) y luego intenta agregar índices a demasiados registros, puede romperlos si está en spindels y no en SSD.