Tengo el siguiente esquema en mi aplicación
/ users/ user1/ username: "mike", totalFollowers: 500190, lastPosts: { post1: { images: [], totalLikes: 191200, date: ... }, post2: { images: [], totalLikes: 71137, date: ... }, ... post10: { images: [], totalLikes: 59301, date: ... } } posts/ user1/ userPosts/ post1/ images: [], totalLikes: 191200, date: ... ... post637/ images: [], totalLikes: 15029, date: ...como puede ver, estoy desnormalizando algunos datos, las últimas 10 publicaciones de usuarios. Entonces, cuando un usuario carga una publicación, tengo que ejecutar una transacción, de la siguiente manera:
function uploadPost(postId, postOwnerId) { const postId = uuidv4(); const postsRef = firestore .collection("posts") .doc(postOwnerId) .collection("userPosts") .doc(postId); const userRef = firestore.collection("users").doc(postOwnerId); return firestore.runTransaction(async (transaction) => { // Get the post owner data const postOwnerData = await getUserData(postOwnerId, transaction); ... }solo para:
1. Delete the current oldest post from the user's lastPosts map 2. Add the new post to itAdemás, cuando a un usuario le gusta una publicación, también necesitaré una transacción, porque será necesario:
1. Read the user's lastPosts map to check if it contains the liked post 2. Synchronize the lastPosts' post with the post doc's totalLikesTengo miedo de no ser escalable en absoluto. Como puede ver, cuando cargue o le guste una publicación, tendré que leer el documento del usuario para obtener el campo lastPosts más actualizado. Pero... como no estoy usando contadores distribuidos para totalLikes y totalFollowers (me parece demasiado caro), creo que si, por ejemplo, 5 de los 11 contadores que tiene el documento se actualizan varias veces en un período corto (5 segundos), mis transacciones fallarán.
¿Es correcto? ¿Debo evitar la desnormalización de las últimas publicaciones para obtener una buena escalabilidad?
Nota: Solo estoy almacenando las últimas 10 publicaciones porque mi interfaz de usuario pagina las publicaciones de los usuarios de 10 en 10, y tener las publicaciones de los usuarios más recientes adjuntas al documento del usuario me ahorraría 10 lecturas cada vez que alguien visita su perfil.