konto usunięte

Temat: MongoDB a zależności pomiędzy tabelami

Uszanowanie,
takie pytanie do tych którzy bawią się z MongoDB. Zrobiłem sobie relatywnie prosty ORM dla MongoDB w którym za cel postanowiłem sobie - nigdy nie zaglądać do bazy danych.

Więc łącząc się z bazą danych bezczelnie pobieram listę kolekcji i indeksów. Mappery które zajmują się zapisem/odczytem mają w sobie wpisane
- źródło danych czyli nazwę kolekcji
- listę pól na które należy nałożyć indexy
W momencie pierwszego odwołania do jakiejkolwiek kolekcji, Mapper sprawdza czy takowa nie została stworzona (porównując z listą kolekcji którą pobrał po połączeniu) oraz sprawdza czy indexy dla kolekcji się pokrywają.
Jeżeli nie to przy pierwszym zapisie nakaże nałożyć brakujące indexy co sprawia że owa operacja jest robiona tylko raz tak jak wydaje mi się - powinno się odbyć.
I ogólnie wszystko cacy. Zmiany w aplikacji nie wymagają ode mnie zmiany struktury w bazie danych czy czegoś w tym stylu. Wszystko co robię to dodaję/usuwam nowe pole w obiekcie danych lub dodaje nowy mapper które będzie reprezentował kolekcję i po sprawie. Działa.
Ostatnio nawet pobawiłem się w ten sposób że jeżeli zrobimy połączenie do 2 lub więcej odrębnych baz MongoDB, aplikacja nadal widzi ją jako jedną co znacząco upraszcza życie. To na przyszłość.

Został mi JEDEN orzech do zgryzienia. Zależności. W relacyjnych bazach danych sprawa jest prosta. Klucze obce załatwiają za mnie sprawę czyszczenia bazy usuwając wszystkie rekordy zależne jak leci.
Niestety MongoDB nie oferuje czegoś takiego.

Więc zastanawiam się JAK czyścić dane z innych kolekcji które są w jakikolwiek sposób kojarzone z kolekcją z której usuwam dane ? Jak na razie pomysłów mam niewiele. Jednym z nich były kolekcje pośrednie mające nazwę składającą się z nazw 2 kolekcji. I z jej użyciem usuwać dane zależne. Nie było by z tym problemu z uwagi na to że jak mówiłem - po połączeniu obiekt bd przechowuje listę kolekcji które mam w bd. Konfliktów nazw by nie było bo jako standard używam Camela a te łączył bym za pomocą "_".
Ktoś inny mówił żeby po prostu dokładać dane do tabeli users ale to mi się nie widzi z kilku przyczyn.

Jakieś sugestie ?
Jacek R.

Jacek R. programista

Temat: MongoDB a zależności pomiędzy tabelami

Moim zdaniem to co piszesz kompletnie nie wchodzi do filozofii baz dokumentowych, takich jak MongoDB. Sam ORM brzmi śmiesznie - Object-Relational Mapping. Ale przecież w bazach dokumentowych nie ma relacji. Mapowanie też nie jest potrzebne. Cała idea baz NoSQL to trzymać dane w postaci całych obiektów, zdenormalizowane w kontekście baz relacyjnych. Bez połączeń, bez relacji. Na tym właśnie polega różnica.

Chcesz używać bazy jak relacyjnej, to używaj relacyjnej, po co tak kombinować?

konto usunięte

Temat: MongoDB a zależności pomiędzy tabelami

Jacek R.:
Moim zdaniem to co piszesz kompletnie nie wchodzi do filozofii baz dokumentowych, takich jak MongoDB. Sam ORM brzmi śmiesznie - Object-Relational Mapping. Ale przecież w bazach dokumentowych nie ma relacji. Mapowanie też nie jest potrzebne. Cała idea baz NoSQL to trzymać dane w postaci całych obiektów, zdenormalizowane w kontekście baz relacyjnych. Bez połączeń, bez relacji. Na tym właśnie polega różnica.

Chcesz używać bazy jak relacyjnej, to używaj relacyjnej, po co tak kombinować?

Hmmm... może rzeczywiście niepotrzebnie użyłem terminu "ORM" :) MongoDB używam w jednym projekcie gdzie współpracuje ze sobą kilka różnych urządzeń które regularnie wysyłają dane do serwera. Najprostsza metoda ich przechowywania.

Jako że wszystkie dane są reprezentowane przez obiekt danych a mapper tylko zapisuje/odczytuje/wyszukuje owe dane, sprowadziłem sobie MongoDB i MySQL do jednego mianownika. Więc z punktu widzenia programisty korzystającego z dostarczonych narzędzi nie widzi on z jaką bazą aktualnie pracuje. Nawet nie wie czy to rzeczywiście baza danych.
W tym wypadku rozwiązanie idealne.

Potrzebne mi to nie jest. Też nie mam zamiaru używać MongoDB jak relacyjną bazę danych bo jak słusznie mówisz - od tego jest relacyjna baza danych. Po prostu zastanawiałem się czy jest jakiś trik który pozwolił by na wprowadzenie takiego mechanizmu który pozwolił by na utrzymanie jakiś zależności między danymi i czyszczenie danych na podstawie owych zależności. Nigdy nie próbowałeś z niczym eksperymentować ? :P Chociażby po to by pokazać że się da ? :PDariusz Półtorak edytował(a) ten post dnia 28.06.12 o godzinie 14:03

konto usunięte

Temat: MongoDB a zależności pomiędzy tabelami

@Dariusz
Triku nie ma, jest tylko czyste klepanie kodu :)

Dodaj kolekcję pośrednią - najbardziej uniwersalne.

konto usunięte

Temat: MongoDB a zależności pomiędzy tabelami

Michał Wachowski:
@Dariusz
Triku nie ma, jest tylko czyste klepanie kodu :)

Dodaj kolekcję pośrednią - najbardziej uniwersalne.

Najbardziej uniwersalne ale też wymaga właśnie dodatkowej kolekcji. Chyba że zrobię tak by kolekcje pośrednie były tworzone dynamicznie i były ukryte przed programistą. Przeleciałem po dokumentacji MongoDb i nic lepszego nie przyszło mi do głowy.
Jacek R.

Jacek R. programista

Temat: MongoDB a zależności pomiędzy tabelami

Wszystko się da, tylko po co? Możesz przerobić Porsche na gaz, zmienić mu zawieszenie i dorobić dużą pakę, by wozić ziemniaki po polskich drogach, ale czy ma to sens?

Założeniem NoSQL jest zgoda na rezygnacje z modelu relacyjnego w celu dużej szybkości w wydobywaniu dużej ilości danych z dużego magazynu. Jeśli nie możesz poświęcić relacji, nie wybieraj NoSQL, bo wszystkie zalety takiego rozwiązania stracisz bawiąc się w symulowanie zależności.

konto usunięte

Temat: MongoDB a zależności pomiędzy tabelami

Jacek R.:
Wszystko się da, tylko po co? Możesz przerobić Porsche na gaz, zmienić mu zawieszenie i dorobić dużą pakę, by wozić ziemniaki po polskich drogach, ale czy ma to sens?

Założeniem NoSQL jest zgoda na rezygnacje z modelu relacyjnego w celu dużej szybkości w wydobywaniu dużej ilości danych z dużego magazynu. Jeśli nie możesz poświęcić relacji, nie wybieraj NoSQL, bo wszystkie zalety takiego rozwiązania stracisz bawiąc się w symulowanie zależności.

Może to zabrzmi głupio ale na pytanie "po co" odpowiem "bo się da" :) Nigdy nie robiłeś niczego tylko po to by to zrobić ? Nigdy nie będę używał MongoDB jak relacyjną bazę danych co nie znaczy że nie mogę wprowadzić do jej obsługi dodatkowych mechanizmów które widziałem gdzieś indziej.

Może popatrz na to rozwiązanie które sobie zrobiłem jak na jQuery. To działa ładnie pod nowoczesnymi przeglądarkami a pod starym IE nadal potrafi symulować niektóre brakujące mechanizmy czasami wykonując dużą ilość operacji na DOM.
Normalnie unikamy takich sytuacji co nie zmienia faktu że SIĘ DA :) I to powiedzmy że mamy podobną sytuację.

Jak to mówią - to jak z prezerwatywą. Lepiej mieć i nie potrzebować jak potrzebować i nie mieć. Celowości się nie doszukuj. Po prostu MongoDB jest 4 źródłem danych które mój mechanizm obsługuje i właściwie mechanizm relacji to jedyna rzecz jaka MongoDB różni pod pozostałych dwóch (bo trzeci korzysta z Facebook API i tutaj nie ma już mowy o zależnościach bo wszystko co robi jest read-only) więc postanowiłem sobie takowy dopisać.Dariusz Półtorak edytował(a) ten post dnia 28.06.12 o godzinie 14:50
Jacek R.

Jacek R. programista

Temat: MongoDB a zależności pomiędzy tabelami

Dariusz Półtorak:
Może to zabrzmi głupio ale na pytanie "po co" odpowiem "bo się da" :) Nigdy nie robiłeś niczego tylko po to by to zrobić ? Nigdy nie będę używał MongoDB jak relacyjną bazę danych co nie znaczy że nie mogę wprowadzić do jej obsługi dodatkowych mechanizmów które widziałem gdzieś indziej.
We wszechświecie, w którym mam nieograniczone zasoby czasowe, na pewno takie rzeczy robiłem :)

konto usunięte

Temat: MongoDB a zależności pomiędzy tabelami

Jacek R.:
Dariusz Półtorak:
Może to zabrzmi głupio ale na pytanie "po co" odpowiem "bo się da" :) Nigdy nie robiłeś niczego tylko po to by to zrobić ? Nigdy nie będę używał MongoDB jak relacyjną bazę danych co nie znaczy że nie mogę wprowadzić do jej obsługi dodatkowych mechanizmów które widziałem gdzieś indziej.
We wszechświecie, w którym mam nieograniczone zasoby czasowe, na pewno takie rzeczy robiłem :)

Kiedy masz gotowy mechanizm który napisałeś bo był Ci potrzebny, to żaden problem dopisać sobie dodatkowy. Wszystko już mam. Wystarczy mechanizm wywołania na konkretnych kolekcjach operacji remove() na paru prostych warunkach.

Klamka zapadła. Będzie tworzona dynamiczna tabela pośrednia nazwana kolekcja1_kolekcja2.
Będzie zawierać nazwę pola kolekcja1 i kolekcja2.
W momencie usunięcia czegoś z kolekcja1 weźmie wartości z kolekcja1 pól oznaczonych jako powiązane i zestawi z wartościami pól z kolekcja2 które są oznaczone jako powiązane i je usunie.
Skorzystam z tego że wszędzie stosuję CaMeL więc zapis z "_" będzie się wyraźnie odróżniał.

Jak by ktoś miał ciekawszy pomysł to walcie śmiało :)Dariusz Półtorak edytował(a) ten post dnia 28.06.12 o godzinie 15:07



Wyślij zaproszenie do