Knockout JS ObservableArray con relaciones de muchos a muchos

Estoy creando una aplicación de lista de invitados usando Knockout.js, y hasta ahora las cosas van bien. Sin embargo tengo una pregunta de mejores prácticas. Mi aplicación tiene varios tipos diferentes de objetos: invitados y etiquetas entre ellos. Los invitados pueden tener varias etiquetas, y las etiquetas pueden tener varios invitados. En diferentes puntos de la aplicación, necesito mostrar ambos arreglos individualmente. Por ejemplo, tengo una vista de "Invitados" donde se pueden ver todos los invitados junto con sus etiquetas asociadas, y también tengo una vista de "Etiquetas" donde se pueden ver todas las etiquetas y sus invitados asociados. En la actualidad, el código para agregar una etiqueta a un invitado es algo como esto:

var tag = function(opts) {
  this.guests = ko.observableArray()

  // Other tag code here...
}

var guest = function(opts) {
  this.tags = ko.observableArray()
  // Other guest code here...

  var self = this

  this.addTag = function(tag) {
    self.tags.push(tag)
    tag.guests.push(self)
  }
}

Sé que debe haber una mejor manera de hacer este tipo de relación de muchos a muchos en Knockout, además de actualizar cada Array observable de forma independiente. Esto también conduce a una especie de estructura de aplicación recursiva donde un invitado tiene una propiedad / matriz de etiquetas que contiene una etiqueta, que tiene una propiedad / matriz de invitado que contiene una huésped, que tiene una propiedad de etiquetas ... obtienes la imagen.

En este momento, la estructura de ViewModel es así:

- Parent Object
  - Guests ObservableArray
    - Guest Object
      - Tag Object as property of Guest
  - Tags ObservableArray
    - Tag Object
      - Guest Object as property of Tag

Así que supongo que mi pregunta es doble: 1) ¿Existe una mejor manera de estructurar mi ViewModel para evitar matrices recursivas? y 2) ¿cómo puedo usar mejor Knockout.js para actualizar mi ViewModel en forma SECA, en lugar de actualizar tanto la matriz de etiquetas Y la matriz de invitados de forma individual? ¡Gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta