Witam, mam do rozwiazania problem architektury aplikacji ktora umozliwia uzytkownikowi dodawanie i grupowanie slowek, ktorych sie uczy (w obcym jezyku np.)
Pierwszym przyblizeniem jest relacja jeden do wielu laczaca uzytkownika z rekordami zapisujacymi metadane slowka (UserWord),
z wylaczeniem danych slownikowych czyli tlumaczeniem, czesciami mowi itd.
Dane slownikowe zawieraja sie w kolekcji nosql (Word), Word embeds_many definitions.
W kazdym z rekordow relacji ze slowkami (UserWord) znajduje sie klucz obcy
odwolujacy sie do kolekcji.
Typowe uzycie zasobu wyglada mniej wiecej tak.
[code]# wyciagamy idki slowek usera
user_word_ids = User.last.user_words.map(&:word_id)
wyciagamy dane leksykalne, tlumaczenia
dict_words = Word.any_in(:word_id => user_word_ids)
prezentujemy dane
dict_words.first.value #cat
dict_words.first.definitions #kot, kotek etc.[/code]
Architektura powyzsza ssie dlatego ze:
Kontekst1: Relacja user-slowko (UserWord) jest traktowana duza iloscia updejtow, insertow, deletow, i selectow, jak rowniez strategia ich wybierania jest rozna, tj
W kontekscie listy slowek uzytkownika:
- raz potrzebujemy kompletnie wszystkiego
- raz potrzebyjemy kilku rekordow po okreslonym warunku
- raz potrzebujemy miec wszystko pogrupowane po jakims atrybucie UserWord.
Dlatego embedowanie User embeds_many UserWord, calkiem odpada.
Kontekst2: Kolekcja ze slownikiem (Word) ma tendencje do puchniecia, coraz wiecej danych leksykalnych, definicji etc. i ogolnie jest dosc wielka.
Zapytanie Word.any_in(:word_id => large_array) generuje super-trwajace-za-dlugo zapytanie. I to jest glownym problemem.
Kontekst3: Kolekcja ze slownikiem (Word) jest niezmienna, zawiera dane slownikowe, ktore z duzym prawodpodobienstwem mozna keszowac, tylko jaka strategia ?
Kontekst4: Relacja UserWord, puchnie jeszcze bardziej, w niedlugim czasie przyjmie kilka/nascie M rekordow a patrz. Kontekst1.
Przeczucie odpowiada ze najszybciej bedzie zostawic relacje UserWord, zoptymalizowac ja pod przyjecie sporej ilosci danych w obrebie tej tabelki, a
kolekcje ze slownikiem wrzucic do cache’u, ale tak naprawde to zamiecenie syfu pod wersalke.
Macie jakies wskazowki, pomysly, doswiadczenie w podobnych strukturach, dzieki.