Modelización avanzada de estados
A primera vista, el diseño del almacenamiento clave-valor puede parecer difícil para quienes tienen experiencia en SQL. Aunque las bases de datos como MongoDB u otras bases de datos optimizadas utilizan almacenamiento de valores clave, sus bibliotecas ocultan la complejidad interna a los desarrolladores.
Es por eso que el sistema de almacenamiento en Cosmos-SDK puede no ser fácil de entender inicialmente. Sin embargo, una vez que se comprende el concepto, se vuelve sencillo.
Al implementar un modelo estatal, es importante dar un paso atrás y hacer algunas preguntas antes de comenzar la implementación. Por ejemplo:
¿Realmente necesitas guardar esa información en el estado blockchain?
¿Es realmente necesaria esa conexión? ¿Podría ser entregado a la interfaz de usuario por un recopilador de bases de datos fuera de la cadena?
Al hacer estas preguntas, puede evitar escribir datos innecesarios en el estado y utilizar un exceso de almacenamiento. Usar menos almacenamiento significa una ejecución más barata.
En este tutorial, creará un modelo de estado para el siguiente caso de negocio:
El sistema contendrá personas.
Las personas pueden convertirse en miembros de varios grupos.
Un grupo puede contener varios miembros.
Los miembros pueden tener roles en un grupo, como administrador, superadministrador, regular, etc.
Implementación ingenua
A continuación se muestra un diseño de relación cualquiera a cualquiera para guardar datos mediante ID. En primer lugar, los datos de la persona se indexan mediante un ID que se incrementa automáticamente:
En este diseño, los grupos también se indexan mediante un ID.
Relación de grupo y persona establecida utilizando la estructura de membresía:
Estado de membresía definido usando el campo String de estado.
Implementación optimizada
Usar una identificación para identificar a las personas puede parecer intuitivo, pero crea redundancia. Los ID son simplemente valores utilizados para identificar a un usuario, pero los usuarios ya están identificados por un valor único: su Address. Por lo tanto, es mejor indexar a las personas usando su Address, en lugar de números enteros incrementados automáticamente.
Se eliminó member_id. Se cambió i32 a u8. La optimización de los tipos de variables mejora el consumo de gas, lo que se traduce en menos tarifas.
Ahora para el grupo:
Los grupos no tienen una dirección, por lo que tiene sentido identificarlos mediante ID de incremento automático. Si desea que los nombres de los grupos sean únicos, es mejor utilizar el nombre como índice.
Cuando se guarda un grupo, se requiere el ID de incremento automático y se guarda en el elemento GROUP_COUNTER. Para implementar esta lógica, es mejor ponerla bajo una función:
Para establecer una relación entre grupos y personas, y definir el rol de una persona, sería necesario:
Listar usuarios bajo un grupo
Lista de grupos de una usuaria
Esto se puede lograr mediante la creación de índices secundarios. Le animamos a completar la implementación restante como ejercicio personal.
Last updated