Intermedio7 min de lectura

El atributo Type en DynamoDB

En SQL, la tabla de una fila es su tipo — una fila en documents es un documento. Una sola tabla de DynamoDB mezcla cada entidad bajo un schema, así que un item no lleva una respuesta integrada a «¿qué es esto?».

El atributo Type pone esa respuesta de vuelta: una cadena plana en cada item que nombra la entidad que representa.

¿Qué es el atributo Type en DynamoDB?

El atributo Type es una cadena plana que marcas en cada item — como EntityType: "Document" — nombrando la entidad que ese item representa. Como una sola tabla mezcla muchas entidades bajo un schema, los items no llevan un tipo integrado. El Type lo pone de vuelta, para que tu código identifique filas, filtre un GSI a una sola entidad y sobreviva migraciones.

  • Marca un Type en cada escritura. Un atributo — EntityType: "Document" — en cada item, sin excepciones. Cuesta unos bytes y te salva después.
  • Identifica entidades en una partición mixta. Un Query devuelve workspaces, documentos y comentarios juntos; el Type le dice a tu código cuál es cuál sin parsear prefijos de clave.
  • Potencia el filtrado de una sola entidad en un . Proyecta el Type a un índice y puedes acotar un índice sobrecargado a exactamente un tipo de entidad.
  • Es tu escape hatch para migraciones. Cuando exportas para remodelar o mover una entidad a su propia tabla, el Type es la columna por la que partes.

Por qué una tabla mixta pierde el tipo

El single-table design guarda cada entidad en una sola tabla detrás de claves genéricas como PK y SK. Ese es todo el punto — un Query devuelve un padre y sus hijos juntos. Pero significa que una partición es heterogénea.

Toma una app SaaS de colaboración de docs. Una partición de workspace guarda el registro del workspace, sus documentos y los comentarios de esos documentos:

PKSKattributes
WS#acmeMETAname, plan, seats
WS#acmeDOC#a1#METAtitle, owner, wordCount
WS#acmeDOC#a1#CMT#0007author, body, createdAt
WS#acmeDOC#a1#CMT#0008author, body, createdAt

Query PK = "WS#acme" te devuelve los cuatro items en una sola lectura facturada. Ahora tu código tiene una lista de items crudos y ninguna forma fiable de decir cuál es un documento y cuál es un comentario — salvo hacer string-match del SK, que es frágil en el momento en que cambia el formato de tu clave.

Marca el Type en cada item

El arreglo es un atributo en cada escritura, nombrando la entidad:

PKSKEntityTypetitle
WS#acmeMETAWorkspace
WS#acmeDOC#a1#METADocumentQ3 Roadmap
WS#acmeDOC#a1#CMT#0007Comment

Ramificar con item.EntityType === "Document" es un check de igualdad estable. Parsear SK.startsWith("DOC#") && SK.includes("#CMT#") es una suposición que se rompe cuando revisas la clave. El Type desacopla tu lógica de lectura de tu encoding de claves — esa es la victoria real.

Query PK = 'WS#acme'Partición mixtaEntityType: 'Workspace'EntityType: 'Document'EntityType: 'Comment'Enrutar por Type

Una lectura devuelve tres tipos de entidad; el atributo Type enruta cada item al handler correcto sin tocar las claves.

Filtra un GSI hasta una sola entidad

El Type se gana el sueldo en los índices. Digamos que añades un GSI claveado en GSI1PK = WS#acme, GSI1SK = updatedAt para listar «todo lo que cambió recientemente en este workspace, lo más nuevo primero». Un índice sobrecargado barre documentos y comentarios — pero una UI de feed puede querer solo documentos.

Dos formas de acotarlo, y la diferencia es dinero:

EnfoqueQué cuestaCuándo usarlo
FilterExpression sobre TypeLee todos los items matchados, factura por todos, tira no-matches tras leerLas entidades mixtas son raras en el resultado; rápido de shippear
Índice sparse (GSI1PK escrito solo en la entidad objetivo)Solo la entidad que quieres aterriza nunca en el índiceUna entidad domina; quieres cero desperdicio

En on-demand de us-east-1, un Query a GSI que devuelve 100 items mixtos de 2 KB cada uno factura más o menos 100 RCU de consistencia eventual — y un FilterExpression sobre EntityType sigue midiendo cada fila antes de tirar los comentarios. Un índice sparse que nunca indexa comentarios solo factura las filas de documento. Modela ambas formas en la calculadora de precios.

Un FilterExpression corre después de que se leen los items y después de que se consume capacidad — AWS es explícito en que filtrar no reduce el coste de lectura (Guía para desarrolladores de DynamoDB: FilterExpression). Filtrar por Type es honesto, no gratis: pagas por los comentarios que tiras.

Para acotar el feed a documentos, la query lleva una condición sobre el atributo Type. Monta el FilterExpression, nombres y valores con el DynamoDB expression builder — emite el placeholder #t = :doc para que no te equivoques con una palabra reservada.

KeyConditionExpression     GSI1PK = :ws
FilterExpression           #t = :doc
ExpressionAttributeNames   { "#t": "EntityType" }
ExpressionAttributeValues  { ":ws": "WS#acme", ":doc": "Document" }

¿Quieres que el índice lleve solo documentos y te saltes el filtro del todo? Escribe GSI1PK solo en items de documento — un . Los items sin la clave del GSI nunca se replican al índice, así que la lectura toca solo documentos. El atributo Type es lo que le dice a tu writer qué items cualifican.

Mantén el valor estable y singular

Elige el valor una vez y trátalo como un enum. Document, nunca a veces Doc y a veces document — un valor que deriva es peor que ningún valor, porque tus checks de igualdad pasan en un casing y pierden el otro en silencio.

Un Type por item. Si un item se siente como dos entidades, eso suele ser un olor de modelado — deberían ser dos items, cada uno en su propia collection o rango de sort key, no una fila con dos sombreros.

El payoff de la migración

La razón para marcar el Type antes de necesitarlo: remodelar. El path recomendado de remodelado es export, transform, reimport — y AWS documenta el export en bulk a S3 exactamente para este tipo de remodelado offline (Exporting DynamoDB to S3).

Cuando llegue ese día, el Type es la columna por la que haces GROUP BY. ¿Quieres levantar comentarios a su propia tabla, o renormalizar el export en ficheros por entidad para un warehouse de analytics? Partes el dump por EntityType. Sin él, vuelves a reverse-engineer claves a lo largo de millones de filas.

Próximos pasos

Un atributo Type es un seguro barato. Úsalo para identificar entidades en una lectura mixta, filtrar un GSI sobrecargado y partir limpio cuando remodeles. Márcalo en cada escritura desde el día uno — retroencajarlo en una tabla en vivo significa un backfill completo.

Lectura relacionada: single-table design para el patrón de partición mixta al que sirve, GSI vs LSI para elegir la forma de índice detrás de un índice sparse, y Query vs Scan para por qué un FilterExpression nunca te ahorra coste de lectura.

Construye el filtro sobre el Type con el DynamoDB expression builder, y prueba DynoTable para explorar una tabla real de entidades mixtas y ver la columna Type alineada en cada item.

Actualizado