Rails i MongoDB

Znacie jakieś dobre źródła gdzie można by poczytać o MongoDB i przede wszystkim stosowaniu tej bazy w aplikacjach Railsowych? Przystępnie, tak żeby można zacząć i naklepać coś małego w Rails + MongoDB (wyłączyć Active Record)
Tak żebym zrozumiał różnicę pomiędzy MongoBD a bazami jak SQLite czy MySQL.

Jak to jest z migracjami? Wiele gemów generuje jakieś migracje, a MongoDB (w railsach korzystam z gema mongoid) podobno nie korzysta z migracji? Co teraz?
Głównie to nie rozumiem jak się mają migracje i MongoDB do siebie…

http://mongoid.org/en/mongoid/index.html -> DOC

Migracji nie ma ta baza nie ma schematu, mozesz tam w kazdym rekordzie trzymac co innego. MongoID jakos to ogarnia pilnujac w miare czy pola jakie sobie zdefiniujesz tam sa. Migracje sa nie potrzeben w ogole. Mozna je stosowac/dodac jesli zmieniasz pole w bazie i chcesz by istniejace dane tez sie zmienily, ale ogolnie nie ma migracji i sa nie potrzebe. Charakter bazy jest inny i do czego innego sluzy

1 Like

W bazach sql stosuje się migracje, aby dodać pola do bazy lub też przekonwertować wartości pól między polami. W NoSQL nie ma schemy (i relacji - co jest główną różnicą między bazami SQL i NoSQL) co powoduje, że nie musisz robić migracji w celu dodania pól. Jeśli chodzi o konwersje danych już istniejących w bazie, to trzeba inaczej rozwiązać, np. przez wywołanie własnego rake taska (przykład).

Jak używasz mongoid, to polecam poczytać:
http://mongoid.org/en/mongoid/index.html
http://mongoid.org/en/mongoid/docs/rails.html

1 Like

http://trug.pl/archive jest cos o mongodb ale stare bardzo bo ale info na start jakies jest

Korzystając z Mongoida bardzo trudno zauważyć różnicę pomiędzy MongoDb a MySQL/Postgresql.

1 Like

Ja w swojej aplikacji mam w jednym miejscu użytą metodę Queryable#ne tak że wygląda to następująco Message.ne(jakis_tam_hash) i zawsze jak na to patrze to mam wrażenie ktoś zrobił literówkę pisząc Message.new(jakis_tam_hash) :slight_smile: Tyle razy już się na to nabrałem…

To ja Ci szybko wytłumaczę i zaoszczędzę 2 lata spapranych projektów:

Nie ma ani jednego zastosowania w którym MongoDB byłoby lepsze od PostgreSQL. Żadnego. A do tego tracisz relacyjność, Twoje dane się łatwiej rozsypią (bo schemat którego niby nie ma się zmieni w czasie życia aplikacji). Zaufaj mi, kilka ładnych aplikacji przy użyciu MongoDB zbudowałem.

@seban:

Korzystając z Mongoida bardzo trudno zauważyć różnicę pomiędzy MongoDb a MySQL/Postgresql.

Dawno nie słyszałem większej bzdury. Jeśli ktoś nie widzi różnicy to nie ma pojęcia jak działa to pod spodem.

Używając MongoDB, w aplikacji gdzie Twoje dane jednak są relacyjne, bardzo szybko przekonasz się że musisz robić mapreduce, używać JavaScriptu w bazie, albo - chrońcie nas przed tym dawni bogowie - przetwarzać spore ilości danych po stronie Rubiego, bo jakoś te rekordy z sobą trzeba połączyć.

Jeśli są jakieś powody dla których chcesz użyć MongoDB, to mogą być one jedynie błędne, kilka z doświadczenia:

  1. “Moje dane nie są z natury relacyjne.” Zazwyczaj błąd. Jeśli masz kolekcję ‘user’ i kolekcję ‘post’ albo ‘payment’ to Twoje dane są relacyjne.

  2. “Potrzebuję robić zapytania przestrzenne.” Jest PostGIS. Jest ellasticsearch. MongoDB sobie wcale z nimi świetnie nie radzi.

  3. “Potrzebuję zmiennej elastycznej struktury danych”. Masz JSON i hstore w postgresie.

Kilka linków wartych przejrzenia jeśli mi nadal nie ufasz:



https://www.andreas-jung.com/contents/goodbye-mongodb

Wybierz PostgreSQL i dobrze go skonfiguruj. Wybierz MariaDB/MySQL i dobrze je skonfiguruj. Dobry sprzęt / hosting i chwilka pracy. Zaoszczędź sobie kilku koszmarów i nie używaj MongoDB.

13 Likes

Chciałem odradzić użycie MongoDB przez niezaawansowanego ale @hubertlepicki pozamiatał i mogę tylko napisać “THIS!”.

Człowiek się kiedyś jarał mongoidami i nodejsami. Instalował jakieś gemy w wersji pre alfa.

A teraz tylko Postgres, Railsy i ładna architektura…

Starzejemy się :wink:

Ja bym powiedział, że raczej dał się ponieść hejtowi na nowe rzeczy (w tej sytuacji). Rozumiem, że nowe rzeczy trzeba poznawać, żeby nie zostać w tyle, ale trzeba do tego podchodzić z rezerwą.

Ja się do dziś jaram. Bazy NoSQL okazały się mieć swoje miejsce w stosach technologicznych wielu poważnych aplikacji – tylko że to miejsce nie jest zamiast ACID-owej bazy relacyjnej w roli głównego datastore’u.
Podobnie nodejs – jest świetny do wielu zastosowań (Ember-CLI, mądra kompilacja assetów itd.) ale nie do stawiania na tym produkcyjnej aplikacji.

1 Like

Mongo to naprawdę świetna baza… ale jako uzupełnienie postgresa/mysql, nie jako główny storage danych.

Korzystam produkcyjnie z mongo w całkiem sporej aplikacji, ale wszystkie dane i tak siedzą w mysql - Mongo robi za swoisty cache z replikacją (bo replicasety są naprawdę fajnym featurem). Ale nie zaufałbym mu na tyle, żeby miał być jedyną bazą.

Myślę, że Sebanowi chodziło o to, że Mongoid stara się ukryć “nierelacyjność” Mongo (tudzież bardzo w tym pomaga). O, tutaj przykład z oficjalnej strony:

class Artist
  include Mongoid::Document
  field :name, type: String
  embeds_many :instruments
end

class Instrument
  include Mongoid::Document
  field :name, type: String
  embedded_in :artist
end

syd = Artist.where(name: "Syd Vicious").between(age: 18..25).first
syd.instruments.create(name: "Bass")
syd.with(database: "bands", session: "backup").save!

Jeśli ktoś nie wie jak działa baza NOSQL i próbuje bez tej wiedzy coś robić w tym kierunku, to prędzej lub później będzie jakaś katastrofa. Oby nie na produkcji :wink:

I to właściwie jest ostatecznym potwierdzeniem czemu MongoDB nie powinno być domyślnym datastore’em: bo relacje będziesz miał prędzej czy później i lepiej robić je w bazie do tego przygotowanej niż takiej, gdzie jest to na pałę robione zmapowaniem kluczy obcych i osobnym findem.

1 Like

Pozwolę podczepić się pod temat.

Właśnie stoję przed wyborem bazy danych do mojego prywatnego projektu, mam cichą nadzieję że przyjdzie mi się zmagać z dużą ilością danych oraz zapytań. Dlatego zamierzam już na samym początku wybrać rozwiązanie które w razie peaku nie położy projektu.
Zastanawiałem się nad mongodb oraz couchdb ze względu na replikację oraz skalowalność, ale widzę że z bazami Document Oriented jest za dużo zabawy oraz do tego konkretnego projektu się nie nadają. Z drugiej strony mamy jeszcze bazy column-family jak np. Cassandra, których struktura w projekcie railsowym wydaje się przyjaźniejsza.
Stąd moje pytanie, czy ktoś z forumowiczów używa Cassandry w produkcji i może podzielić się doświadczeniami?

a dlaczego nie postgres? :wink:

1 Like

IMHO źle podchodzisz do tematu, ponieważ:

  1. Aktualnie nie masz oszacowania co do ilość danych oraz zapytań (a przynajmniej tak zakładam). Pytanie też co to jest duża ilość danych/zapytań.
  2. Wybierasz rozwiązanie nie podpierając się żadnymi danymi ilościowymi.

To zawsze prowadzi do katastrofy pod warunkiem, że nie chodzi tylko o edukację tj. cenimy wyżej walory edukacyjne niż stabilność i niezawodność działania.

1 Like

Tak w zupełności się z Tobą zgodzę, nie ukrywam że chodzi również o wartość edukacyjną. Wyczytałem ostatnio na blogu jednego z guru startupów że większość ludzi nie docenia wartości jaką niesie nauka nowych rzeczy przy tworzeniu projektu.