es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Diseño de tabla de DynamoDB: ¿Cómo modelo una relación de uno a muchos donde necesito todos los elementos “uno” y uno de los “muchos” ordenados por algún atributo?

He pasado toda mi carrera trabajando con bases de datos relacionales desnormalizadas. Me está resultando difícil desaprender todo eso para implementar un diseño de tabla única que pueda manejar un par de patrones de acceso específicos en un proyecto personal tipo “App Store”.

Aquí hay un ERD rápido. Hay un modelo de aplicación identificado por una plataforma (iOS, Android) y un identificador de paquete junto con un mapa de valores predeterminados que se utiliza al crear nuevas versiones. Cada aplicación puede tener de 0 a muchas versiones que se identifican con un número de versión (que es un valor numérico secuencial y que es único en el contexto de una aplicación). Una versión tiene un atributo IsReleased junto con varios más (como Name, Release Notes, Binary Path, etc).

Patrones de Acceso
1) Listar la última versión de cada aplicación.
2) Listar la última versión de cada aplicación para una plataforma dada.
3) Listar la última versión de cada aplicación donde IsReleased es 1.
4) Listar la última versión de cada aplicación para una plataforma dada donde IsReleased es 1.
5) Obtener la última versión de una aplicación específica.
6) Obtener la última versión de una aplicación específica donde IsReleased es 1.
7) Obtener todas las versiones de una aplicación específica.
8) Obtener todas las versiones de una aplicación específica donde IsReleased es 1.
9) Obtener el atributo predeterminado para una aplicación específica.

Sin embargo, tengo problemas con los patrones de acceso del 1 al 4. Esta tabla es a donde estaba llegando. Me resulta difícil crear GSIs que me den todos los elementos de app con una sola versión por orden de clasificación.

Por ejemplo, para el patrón de acceso 1, quiero:

Para el patrón de acceso 3, querría:

Algunas restricciones de datos que tengo en mente:

  • Actualmente hay solo 10 a 20 aplicaciones, pero necesito poder admitir cientos.
  • La mayoría de las aplicaciones tendrán de 100 a 200 versiones con 20 a 30 versiones publicadas. La aplicación más grande tiene 1000 versiones de las cuales 50 son lanzadas.
  • En el backend, la bandera IsReleased generalmente se alternará de 0 a 1, pero a veces se alternará de 0 a 1.
  • El elemento de versión promedio es de aproximadamente 2 KB.
  • Las variaciones de patrones de acceso donde IsReleased es 1 se usan con más frecuencia en proporción significativa.

Siento que la solución está justo delante de mí, pero no puedo poner el dedo en ella.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en Amazon DynamoDB y modelado de datos de Amazon DynamoDB, sugeriría el siguiente diseño de tabla para los patrones de acceso dados:

    pk sk Atributos
    app_{platform}_{id} metadata #app_data, Defaults
    app_{platform}_{id} version_{version_number} (por ej. version_1) IsReleased, #app_data
    app_{platform}_{id} release_{timestamp}_{version_number} (por ej. release_1639650000_1) #app_data, IsReleased, release_timestamp

    Aquí, pk representa la clave de partición, mientras que sk representa la clave de ordenación. Los elementos metadata y version son similares a los de la tabla original. El elemento release incluye una marca de tiempo que representa el momento en que se lanzó la versión.

    Para manejar los patrones de acceso:

    1. Para listar la última versión de cada aplicación, consulte la tabla con una clave de partición de app_{platform}_{id} y una clave de ordenación que comienza con version_. Use el parámetro ScanIndexForward para ordenar los resultados en orden descendente. Finalmente, use el parámetro Limit para restringir los resultados a la última versión.
    2. Para listar la última versión de cada aplicación para una plataforma dada, use la misma consulta que el patrón de acceso 1 pero filtre por begins_with(pk, "app_{platform}").

    3. Para listar la última versión de cada aplicación donde IsReleased es 1, use la misma consulta que el patrón de acceso 1 pero filtre por IsReleased = 1.

    4. Para listar la última versión de cada aplicación para una plataforma dada donde IsReleased es 1, use la misma consulta que el patrón de acceso 3 pero filtre por begins_with(pk, "app_{platform}").

    5. Para obtener la última versión de una aplicación específica, consulte la tabla con una clave de partición de app_{platform}_{id} y una clave de ordenación que comienza con version_. Use el parámetro ScanIndexForward para ordenar los resultados en orden descendente. Finalmente, use el parámetro Limit para restringir los resultados a la última versión.

    6. Para obtener la última versión de una aplicación específica donde IsReleased es 1, use la misma consulta que el patrón de acceso 5 pero filtre por IsReleased = 1.

    7. Para obtener todas las versiones de una aplicación específica, consulte la tabla con una clave de partición de app_{platform}_{id} y una clave de ordenación que comienza con version_.

    8. Para obtener todas las versiones de una aplicación específica donde IsReleased es 1, use la misma consulta que el patrón de acceso 7 pero filtre por IsReleased = 1.

    9. Para obtener el atributo Defaults de una aplicación específica, consulte la tabla con una clave de partición de app_{platform}_{id} y una clave de ordenación de metadata.

    Espero que esto le ayude a diseñar la estructura de tabla que pueda manejar sus patrones de acceso específicos. ¡Buena suerte con su proyecto!

Comments are closed.