Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

323
Vistas
¿Elegir un modelo de base de datos para una aplicación similar a Notion, basada en bloques ("párrafos") o basada en documentos?

1. El problema

Últimamente, parece que muchos administradores de notas con estructura de árbol "infinita" están eligiendo un modelo de bloque (donde cada párrafo es una entrada en la base de datos), en lugar de un modelo de documento o archivo.

bloques Documentos
Noción
flujo de trabajo
Remnote
dinalista
Investigación itinerante
Evernote
Obsidiana
aplicación de oso

Si encuentra algún error en la tabla, por favor hágamelo saber.

Llevamos 8 meses desarrollando una aplicación muy similar a Notion, también usando el modelo de bloques, pero estamos considerando hacer un cambio radical y cambiar al modelo de documentos. La estructura de nuestros bloques en MongoDB actualmente se ve así:

 _id: "61fd3ede7f6d2cc7a53ca669" children: Array 0: "61fd3ee87f6d2cc7a53ca66b" 1: "61fd3ef37f6d2cc7a53ca671" 2: "61fd3ef77f6d2cc7a53ca673" backlinks: Array type: "bullet" parentPage: Array _id: "61fd3ede7f6e2ccra53ca664" userParent: "german-jablo" permisionParent: "edit, comment, read" parentParagraph: "61fd3ede7f6d2cc7a53ca668" content: "<p>This is a paragraph</p>" isCollapsed: false createdAt: 2022-02-04T14:57:34.280+00:00 updatedAt: 2022-02-04T14:57:59.585+00:00

Muchas páginas hablan de las diferencias de ambos enfoques ( ejemplo ) aunque de forma muy vaga, por lo que decidimos abrir este hilo para encontrar una respuesta más científica a la pregunta.

Características de nuestra aplicación

aplicación Bloques que se pueden abrir como documentos Bloques que pueden colapsar o expandir a sus hijos
Noción Bloques de tipo de página Alternar bloques de tipo
flujo de trabajo Todos Todos
Evernote Documentos Ninguna
nuestra aplicación Bloques de tipo de página Todos los otros

Nuestra aplicación tiene dos tipos de "bloques". El tipo de página (que, como en Notion, se puede insertar en cualquier nota y generar un documento "dentro" del documento actual), y el resto de bloques, que son equivalentes al tipo de bloque "toggle" en Notion (es decir, pueden colapsarse o sus hijos anidados pueden expandirse).

2. Lo que hemos probado

Al tratar de responder a nuestra pregunta (qué modelo de base de datos funcionaría mejor para nuestra aplicación), nos dimos cuenta de que la respuesta probablemente sea "depende". Quizás ambos modelos tengan fortalezas o debilidades en diferentes tipos de operaciones o situaciones. Es por eso que formulamos esta tabla de comparación que describe cómo creemos que sería el desempeño de ambos modelos para cada una de estas operaciones.

Operación bloques Documentos Ganador aparente
Obtener el contenido de una página Encuentra todos los párrafos en la base de datos. Busque el documento en la base de datos. Documento
Renderizar el contenido de una página** Construya el árbol a partir de los párrafos recursivamente. Puede omitir los elementos secundarios de los párrafos cuya propiedad isCollapsed sea verdadera Renderizar el documento Documento
Actualizar el contenido de un párrafo en la base de datos Solo se reescribe el párrafo modificado. Se reescribe todo el documento. Cuadra
Alternativas para renderizar documentos muy grandes * Los bloques se pueden recuperar o representar a medida que se desplaza ( como lo hace Workflowy ), o a medida que expande los párrafos secundarios que estaban contraídos. Pensé que Grifds podría lograr un comportamiento similar, dividir el documento en fragmentos más pequeños y unirlos por partes, pero no admite la actualización de un fragmento individual, o incluso del documento completo . También podría corromper un HTML al dividirlo en formato binario. Cuadra
Importar o pegar contenido Además de convertir el portapapeles a HTML y/o desinfectarlo, debe configurar párrafos con estructura de árbol recursivamente. Nota: Roam Research, por ejemplo, admite la importación en formato JSON, pero generalmente los usuarios no manejan este formato de antemano. Solo convierta el portapapeles a HTML y/o desinfecte el portapapeles Documento
Copiar contenido** El portapapeles debe ser desinfectado y/o transformado Correcto por defecto** Documento
Colaboración en tiempo real A nivel de documento, podría usar alguna biblioteca basada en árbol (Json) como Automerge , o combinarla con alguna biblioteca CRDT para el nivel de párrafo. Podría usar la solución tinymce . ¿Corbata? Ambos parecen tener sus ventajas y desventajas.

* Procesar documentos muy grandes : la mayoría de los usuarios probablemente no utilicen notas de más de 250 kb (considerando que los archivos multimedia se mencionan en una colección separada). Aún así, en el modelo de documento, surge la pregunta: ¿cómo podemos cargar, renderizar o editar documentos grandes en fragmentos manejables? Una idea que se nos ocurrió es dividir los documentos HTML que alcanzan grandes dimensiones en porciones de cierto tamaño en kb, en lugar de dividirlos en párrafos. (Sería como una especie de Gridfs que te permite modificar el archivo por partes). ¿Podría ser una buena idea?

** ¿Debe anidarse el DOM? Para poder colapsar o expandir los párrafos secundarios anidados, los administradores de notas con un modelo de bloque estructuran el DOM de forma anidada (los párrafos están en divs, dentro de sus divs principales, etc.). Sin embargo, una alternativa en el modelo de documento podría ser que cuando el usuario presione tab, solo a ese bloque (etiqueta HTML como <p> o <li> ) se le asigne un atributo con un número menor o igual a 1, que represente el anidamiento. niveles relativos al bloque anterior. De esta manera, cuando presiona tabulador para anidar o shift-tabulador para anular, solo tiene que modificar un atributo de un elemento HTML en lugar de muchos elementos; y el DOM se mantiene simple, sin tener bloques anidados.

3. Nuestras conclusiones

Creemos que para cada una de las filas de la tabla de comparación, se podrían hacer puntos de referencia para medir el rendimiento de ambos modelos. Otras personas han hecho algo similar aquí y aquí , comparando el rendimiento de los administradores de notas usando ambos modelos. El problema con esas pruebas es que es difícil sacar una conclusión precisa sobre la bondad de ambos modelos. Obsidian usa documentos localmente, por lo que no tiene que sincronizar notas. Roam Research es una aplicación muy nueva y mal optimizada. Standard Notes cifra las notas localmente. En otras palabras, no siempre son manzanas con manzanas.

Y aunque se pudieran hacer pruebas, creemos que la respuesta puede incluso depender de cómo cada usuario utilice la aplicación. Supongamos que el usuario A suele organizar sus notas en documentos extensos mediante el anidamiento de párrafos (para contraerlos o expandirlos). Por otro lado, el usuario B suele organizar sus notas creando nuevos documentos dentro de los documentos. Es probable que un administrador basado en modelos de bloques funcione mejor para el usuario A, mientras que uno basado en documentos funcione mejor para B.

Entonces, tratamos de llevar nuestra duda lo más lejos que pudimos, pero aún no estamos seguros de la respuesta. ¿Cuál de los dos modelos crees que ofrecería un mejor rendimiento para nuestra aplicación y por qué?

4. Actualizar

Acabo de encontrar información muy interesante. Parece que tanto TinyMCE como CKEditor (hasta la versión 4), la vista y el modelo convergen con el HTML basado en contenido editable. Sin embargo, CKEditor 5 cambió a MVC [fuente 1] , [fuente 2] . imagen tomada del blog de tinymce

He hecho una breve prueba pegando un portapapeles grande de unos pocos MB en TinyMCE 5, CKEditor 4 y CKEditor 5, y este último ha sido un poco más lento. Espero pronto poder hacer más pruebas con otras cosas como arrastrar bloques o renderizar documentos grandes.

En un hilo de GitHub sobre el rendimiento de CKEditor 5 cuando se trabaja con documentos grandes , uno de los colaboradores dijo: "Obviamente, funciona más lento que el elemento editable de contenido nativo, pero la experiencia de escritura es bastante buena".

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Parece que has hecho tu tarea. El modelado de bases de datos es a veces más un arte que una ciencia. Creo que con ambos modelos puedes conseguir un buen rendimiento si los optimizas bien. Así que te recomendaría que vayas por el que requiere menos trabajo. Ya que ha estado trabajando en el modelo de bloques durante 8 meses, esa es probablemente la mejor opción para usted.

over 4 years ago · Santiago Trujillo Denunciar

0

Me encanta lo bien que pensaste en el diseño de tu aplicación. Solo quiero agregar algunas sugerencias que podría considerar:

  • Obsidian está utilizando un enfoque híbrido. Comenzó basado en documentos, pero ahora admite enlaces en bloque e incrustaciones sin dejar de ser súper rápido. De todos los programas probados en mi punto de referencia que vinculaste anteriormente, Obsidian fue el más rápido.
  • Una de las funciones más importantes de una herramienta de toma de notas es la búsqueda efectiva de probablemente miles de notas. Creé una prueba increíblemente simple (la prueba "Spaghetti Parmesan") donde todos los enfoques basados en bloques actualmente fallan. Se trata de buscar dos ingredientes (espaguetis y parmesano) en una receta. Cuando ambos ingredientes están en bloques diferentes, todas las aplicaciones comunes basadas en bloques finalmente no logran encontrar la receta. Puedes leer más sobre esto aquí . También traté de iniciar una discusión con algunos de los autores en Twitter , pero no obtuve ningún resultado serio. Si desea continuar con el enfoque basado en bloques, puede comenzar a diseñar un algoritmo de búsqueda que pueda manejar los términos de búsqueda distribuidos en bloques (si aún no lo ha hecho). Traté de delinear un algoritmo en el hilo vinculado anteriormente, pero no estoy seguro de si realmente funcionará con cientos de miles de bloques.
over 4 years ago · Santiago Trujillo Denunciar

0

Parece que está haciendo su elección en función de lo que es más fácil de modelar o desarrollar.

Si tiene la intención de competir en este mercado cada vez más concurrido, debe considerar qué le dará una ventaja y qué será sostenible a largo plazo.

Dos de los principales problemas que enfrentó Evernote (usuario desde hace mucho tiempo y ex empleado) fueron:

  • un back-end muy mal diseñado que era muy costoso de escalar e hizo que compartir y colaborar fuera una pesadilla (en términos de ingeniería)
  • un modelo de documento demasiado flexible que dificultaba mucho agregar nuevas funciones al editor (colaboración en tiempo real) y hacía que la colaboración fuera muy complicada incluso para funciones simples (las casillas de verificación a menudo generaban tantos conflictos de notas que no se podían usar)

Por otro lado, las herramientas basadas en bloques suelen tener cortadores web realmente malos, porque es muy difícil pasar de HTML a bloques.

¡Resuelva algunos de estos problemas difíciles!

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda