Knockout JS ObservableArray com muitos-para-muitos relacionamentos

Estou criando um aplicativo de lista de convidados usando o Knockout.js, e até agora as coisas estão indo bem. No entanto, tenho uma questão de melhores práticas. Meu aplicativo tem vários tipos diferentes de objetos: convidados e tags entre eles. Os convidados podem ter várias tags e as tags podem ter vários convidados. Em diferentes pontos do aplicativo, preciso exibir os dois arrays individualmente. Por exemplo, tenho uma visualização "Convidados", na qual é possível ver todos os convidados junto com as tags associadas, além de ter uma visualização "Tags", na qual é possível ver todas as tags e os convidados associados. Atualmente, o código para eu adicionar uma tag a um convidado é algo como isto:

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)
  }
}

Eu sei que deve haver uma maneira melhor de fazer esse tipo de relacionamento muitos-para-muitos no Knockout além de atualizar cada observableArray independentemente. Isso também leva a um tipo de estrutura de aplicativo recursiva em que um convidado possui uma propriedade / array de tags que contém uma tag, que possui uma propriedade guest / array que contém um guest, que possui uma propriedade tags ... você obtém a imagem.

Agora, a estrutura ViewModel é assim:

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

Então eu acho que a minha pergunta é dupla: 1) Existe uma maneira melhor de estruturar o meu ViewModel para evitar matrizes recursivas? e 2) como posso usar melhor o Knockout.js para atualizar meu ViewModel de uma maneira DRY, em vez de atualizar tanto a matriz de tags como a matriz de guests individualmente? Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion