Właśnie natknąłem się na to pytanie i chociaż jest stare, pomyślałem, że warto dodać kilka możliwości nie wymienionych w udzielonych odpowiedziach. W ciągu ostatnich kilku lat sytuacja nieco się zmieniła, dlatego warto podkreślić, że SQL i NoSQL zbliżają się do siebie.
Jeden z komentatorów poruszył mądrą ostrożną postawę, że „jeśli dane są relacyjne, używaj relacyjności”. Jednak ten komentarz ma sens tylko w świecie relacji, gdzie schematy zawsze poprzedzają aplikację.
ŚWIAT
RELACYJNY : Dane strukturalne> Napisz aplikację, aby ją otrzymać
NOSQL WORLD: Zaprojektuj aplikację> Odpowiednio skonstruuj dane
Nawet jeśli dane są relacyjne, NoSQL jest nadal opcją. Na przykład relacje jeden do wielu nie stanowią żadnego problemu i są szeroko omówione w dokumentach MongoDB
ROZWIĄZANIE PROBLEMU Z ROKU 2010
Odkąd opublikowano to pytanie, podjęto poważne próby zbliżenia noSQL do SQL. Zespół kierowany przez Yannisa Papakonstantinou z Uniwersytetu Kalifornijskiego (San Diego) pracował nad FORWARD , implementacją SQL ++, która wkrótce może być rozwiązaniem uporczywych problemów, takich jak ten opublikowany tutaj.
Na bardziej praktycznym poziomie, wydanie Couchbase 4.0 oznaczało, że po raz pierwszy możesz wykonywać natywne JOIN w NoSQL. Używają własnego N1QL. Oto przykład JOIN
z ich samouczków :
SELECT usr.personal_details, orders
FROM users_with_orders usr
USE KEYS "Elinor_33313792"
JOIN orders_with_users orders
ON KEYS ARRAY s.order_id FOR s IN usr.shipped_order_history END
N1QL pozwala na większość, jeśli nie wszystkie, operacje SQL, w tym agregację, filtrowanie itp.
NIE-TAK NOWE ROZWIĄZANIE HYBRYDOWE
Jeśli MongoDB jest nadal jedyną opcją, to chciałbym wrócić do mojego punktu, że aplikacja powinna mieć pierwszeństwo przed strukturą danych. Żadna z odpowiedzi nie wspomina o osadzaniu hybrydowym, w którym większość danych, o które chodzi, jest osadzana w dokumencie / obiekcie, a odniesienia są zachowywane dla mniejszości przypadków.
Przykład: czy informacje (inne niż nazwa roli) mogą czekać? czy ładowanie aplikacji może być szybsze, jeśli nie żąda się niczego, czego użytkownik jeszcze nie potrzebuje?
Może tak być w przypadku, gdy użytkownik loguje się i musi zobaczyć wszystkie opcje dla wszystkich ról, do których należy. Jednak użytkownik jest „Inżynierem” i opcje tej roli są rzadko używane. Oznacza to, że aplikacja musi tylko wyświetlać opcje dla inżyniera na wypadek, gdyby chciał je kliknąć.
Można to osiągnąć za pomocą dokumentu, który informuje aplikację na początku (1), do jakich ról należy użytkownik i (2) gdzie uzyskać informacje o zdarzeniu związanym z określoną rolą.
{_id: ObjectID(),
roles: [[“Engineer”, “ObjectId()”],
[“Administrator”, “ObjectId()”]]
}
Lub, jeszcze lepiej, zindeksuj pole role.name w kolekcji ról i może nie być konieczne osadzanie ObjectID ().
Inny przykład: czy informacje o WSZYSTKICH żądanych rolach są CAŁKOWITE?
Może się również zdarzyć, że użytkownik loguje się do dashboardu i 90% czasu wykonuje zadania związane z rolą „Inżyniera”. Osadzanie hybrydowe można wykonać dla tej konkretnej roli w całości i zachować odniesienia tylko do reszty.
{_id: ObjectID(),
roles: [{name: “Engineer”,
property1: value1,
property2: value2
},
[“Administrator”, “ObjectId()”]
]
}
Brak schematów jest nie tylko cechą NoSQL, ale w tym przypadku może być zaletą. Zagnieżdżanie różnych typów obiektów we właściwości „Role” obiektu użytkownika jest całkowicie prawidłowe.