¿Cómo representar una relación Many-To-Many en XML o en otro formato de archivo simple?

Tengo una aplicación de gestión de listas que almacena sus datos en una base de datos de relación muchos-a-muchos.

IE Una nota puede estar en cualquier número de listas, y una lista puede tener cualquier número de notas.

También puedo exportar estos datos al archivo XML e importarlo en otra instancia de mi aplicación para compartir listas entre usuarios. Sin embargo, esto se basa en un sistema heredado en el que la relación de lista a nota era de uno a muchos (ideal para XML).

Ahora una nota que está en múltiples listas esentially se divide en dos filas idénticas en el DB y toda la relación entre ellos se pierde.

Pregunta: ¿Cómo puedo representar esta relación many-to-many en un formato de archivo simple y estándar? (De preferencia XML para mantener la compatibilidad hacia atrás)

Creo que su formato XML debe hacer uso de algún tipo de "referencias". Si prefiere que la relación list-to-notes sea visible, entonces puede ser conveniente algo como lo siguiente:

<notes> <note id="Note1"> ... </note> <note id="Note2"> ... </note> ... </notes> <lists> <list id="List1"> <note_refs> <note_ref id="Note1"/> <note_ref id="Note4"/> </note_refs> </list> ... </lists> 

Si por otro lado quieres ver fácilmente las listas asociadas con una nota dada, entonces simplemente puedes invertir los roles de listas y notas en mi ejemplo.

Alternativamente, puede representar la relación many-to-many de forma más simétrica como una relación matemática: define todas las notas, define todas las listas y, a continuación, define un mapeo que consta de pares [list reference, note reference].

En una base de datos, la herramienta para representar relaciones muchos-a-muchos es una tabla de asociación. Cada fila de la tabla representa una asociación entre dos objetos. Por lo tanto, si una nota con un ID de 1 aparece en listas con IDs de 1, 2 y 3, habría tres filas en la tabla de asociación:

  ID NoteID ListID -- ------ ------ 1 1 1 2 1 2 3 1 3 

Puede obtener una nota y todas sus listas relacionadas con una consulta como esta:

 SELECT [columns] FROM Association JOIN Notes ON Note.ID = Association.NoteID JOIN Lists ON List.ID = Association.ListID WHERE Association.NoteID = @NoteID 

Y todas las notas de una lista:

 SELECT [columns] FROM Association JOIN Notes ON Note.ID = Association.NoteID JOIN Lists ON List.ID = Association.ListID WHERE Association.ListID = @ListID 

Así es como lo representarías en XML:

 <Lists> <List ID='1'>...</List> <List ID='2'>...</List> <List ID='3'>...</List> ... <Lists> <Notes> <Note ID='1'>...</Note> </Notes> <Associations> <Association ID='1' NoteID='1' ListID='1'/> <Association ID='2' NoteID='1' ListID='2'/> <Association ID='3' NoteID='1' ListID='3'/> </Associations> 

En, XSLT, puede acceder a esta asociación de la siguiente manera:

 <xsl:template match="List" mode="AssociatedNotes"> <xsl:variable name="Associations" select="/*/Associations/Association[@ListID=current()/@ID]"/> <xsl:apply-templates select="/*/Notes[@ID=$Associations/@NoteID]"/> </xsl:template> <xsl:template match="Note" mode="AssociatedLists"> <xsl:variable name="Associations" select="/*/Associations/Association[@NoteID=current()/@ID]"/> <xsl:apply-templates select="/*/Lists[@ID=$Associations/@ListID]"/> </xsl:template> 

(Tenga en cuenta el uso del atributo mode para evitar que estas plantillas se llamen entre sí hasta obtener un desbordamiento de pila).

Mi primer paso sería algo simple:

 <notes> <note> <title>Groceries to get</title> <list>shopping</list> <list>urgent</list> <body>eggs, cheese, milk</body> </note> </notes> 

¿Eso encajaría con sus necesidades?

La única manera en la que puedo pensar para representar verdaderamente una relación muchos-a-muchos en un XML, o en cualquier otra estructura jerárquica, es usar muchas relaciones uno-a-muchos.

Aquí hay un ejemplo sencillo:

 <list name="listA"> <notes name="noteA" /> <notes name="noteB" /> <notes name="noteC" /> </list> <list name="listB"> <notes name="noteB" /> <notes name="noteC" /> <notes name="noteD" /> </list> 

En otras palabras, cada lista tendría sus notas como nodos secundarios.

Muchos de los nodos secundarios de notas se duplicarían en el archivo XML. El proceso que rellena la base de datos del archivo XML tendría que tener en cuenta nodos secundarios de notas duplicadas.

La otra alternativa es elegir una lista para cada una de las notas. Una nota sería el nodo secundario de sólo una de las listas. La ventaja es que no hay notas duplicadas. La desventaja es que el archivo XML no representa la nota para listar correctamente las relaciones, lo que puede o no ser importante.

Simplemente hazlo así:

 <notes> <note id="1"> <name>George</name> <text>1984</text> <notesLinks> <listId id="1"/> </notesLinks> </note> <note id="2"> <name>George</name> <text>animal farm</text> <notesLinks></notesLinks> </note> </notes> <lists> <list id="1"> <notesLinks> <noteId id="1"/> <noteId id="2"/> </notesLinks> <name>some info</name> </list> </lists> 
  • Problemas con la tarjeta SD de Android
  • ImageView no se extiende (Android)?
  • Los recursos referenciados desde el manifiesto no pueden variar según la configuración
  • Dibujar círculo mediante programación utilizando Android ShapeDrawable
  • Error android.permission.WRITE_SECURE_SETTINGS
  • Android Superposición de imágenes en la lista de capas
  • No se especifica ninguna orientación y el valor predeterminado es horizontal. Esta es una fuente común de errores cuando los niños se añaden dinámicamente
  • Error: Error al analizar XML: no bien formado (símbolo no válido) ...?
  • ¿Cuál es la diferencia entre @id y @ + id?
  • Se muestra Google Maps Android sólo pantalla en blanco
  • Eclipse Android Editor de XML común no puede cambiar entre modos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.