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.
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:
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 quesk
representa la clave de ordenación. Los elementosmetadata
yversion
son similares a los de la tabla original. El elementorelease
incluye una marca de tiempo que representa el momento en que se lanzó la versión.Para manejar los patrones de acceso:
app_{platform}_{id}
y una clave de ordenación que comienza conversion_
. Use el parámetroScanIndexForward
para ordenar los resultados en orden descendente. Finalmente, use el parámetroLimit
para restringir los resultados a la última versión.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}")
.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 porIsReleased = 1
.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 porbegins_with(pk, "app_{platform}")
.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 conversion_
. Use el parámetroScanIndexForward
para ordenar los resultados en orden descendente. Finalmente, use el parámetroLimit
para restringir los resultados a la última versión.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 porIsReleased = 1
.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 conversion_
.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 porIsReleased = 1
.Para obtener el atributo
Defaults
de una aplicación específica, consulte la tabla con una clave de partición deapp_{platform}_{id}
y una clave de ordenación demetadata
.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!