¿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.
- TextView Hyperlink no funciona?
- Cómo proporcionar archivos de datos para las pruebas de unidad de Android
- Interpolador personalizado de Android con xml
- ¿Por qué SwitchPreference no muestra animación al cambiar de encendido a apagado y viceversa?
- Cómo utilizar setEmptyView () con el diseño de lista personalizada en ListFragment
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)
- ¿Cómo puedo referenciar algo en el archivo /values/strings.xml programatically?
- Cómo detener la tarea Asyn en onPreExecute?
- Acolchado CardView y esquinas redondeadas
- ¿Cómo puede convertir el archivo XML local a org.ksoap2.serialization.SoapObject?
- El método más simple para convertir Json a Xml
- ¿Cómo alinear el botón a la derecha, sin ser superpuesto por TextView?
- Diseño del centro Android
- Conexión PhoneGap con el servicio localhost webservice
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>
- Atributo de visibilidad en las preferencias xml no funciona? (Android 2.3)
- Cambio de estilo TextView state_pressed / state_focused / state_selected