reprezentujący relację wiele-do-wielu w couchDB

Powiedzmy, że piszę aplikację do analizy logów. Głównym obiektem domeny będzie LogEntry. Dodatkowo. użytkownicy aplikacji definiują LogTopic, który opisuje, jakie wpisy dziennika są zainteresowani. Ponieważ aplikacja otrzymuje wpisy dziennika, dodaje je do couchDB, a także sprawdza je względem wszystkich LogTopics w systemie, aby sprawdzić, czy odpowiadają one kryteriom w temacie . Jeśli tak, system powinien odnotować, że wpis pasuje do tematu. Tak więc istnieje relacja wiele do wielu między LogEntries a LogTopics.

Gdybym przechowywał to w RDBMS, zrobiłbym coś takiego:

CREATE TABLE Entry (
 id int,
 ...
)

CREATE TABLE Topic (
 id int,
 ...
)

CREATE TABLE TopicEntryMap (
 entry_id int,
 topic_id int
)

Korzystając z CouchDB, najpierw spróbowałem mieć tylko dwa typy dokumentów. Miałbym typ LogEntry, wyglądający mniej więcej tak:

{
  'type': 'LogEntry',
  'severity': 'DEBUG',
  ...
}

i miałbym typ LogTopic, wyglądający mniej więcej tak:

{
  'type': 'LogTopic',
  'matching_entries': ['log_entry_1','log_entry_12','log_entry_34',....],
  ...
}

Widać, że reprezentuję relację za pomocąmatching_entries pole w każdym dokumencie LogTopic do przechowywania listy identyfikatorów dokumentów LogEntry. Działa to do pewnego stopnia, ale mam problemy, gdy wielu klientów próbuje dodać pasujący wpis do tematu. Obie próbują optymistycznych aktualizacji, a jedna nie. Rozwiązaniem, którego teraz używam, jest zasadniczo odtworzenie podejścia RDBMS i dodanie trzeciego typu dokumentu, na przykład:

{
  'type':'LogTopicToLogEntryMap',
  'topic_id':'topic_12',
  'entry_id':'entry_15'
}

To działa i mija problemy z aktualizacją współbieżną, ale mam dwie zastrzeżenia:

Obawiam się, że używam tego podejścia, ponieważ to, co bym zrobił w relacyjnej bazie danych. Zastanawiam się, czy istnieje rozwiązanie typu couchDB (relaksujące?).Moje widoki nie mogą już pobierać wszystkich wpisów dla określonego tematu w jednym wywołaniu. Moje poprzednie rozwiązanie pozwoliło na to (jeśli użyłem parametru include_docs).

Czy ktoś ma dla mnie lepsze rozwiązanie? Czy pomogłoby to, gdybym opublikował także widoki, których używam?

questionAnswers(3)

yourAnswerToTheQuestion