Używam mongoDB po raz pierwszy w usłudze REST. Poprzednio kolumna id w moich bazach danych SQL była inkrementującą liczbą całkowitą, więc moje RESTful punkty końcowe wyglądałyby tak jak /rest/objectType/1
. Czy istnieje jakikolwiek powód, dla którego nie powinienem używać MongoDB ObjectId's w tej samej roli, czy też jest mądrzejszy zachować oddzielną, rosnącą kolumnę z liczbami całkowitymi i używać jej dla adresów URL?Czy są jakieś powody, dla których powinienem/powinienem nie używać ObjectId's w moim URLU RESTOWN?
Czy są jakieś powody, dla których powinienem/powinienem nie używać ObjectId's w moim URLU RESTOWN?
Odpowiedz
Po kilkukrotnym użyciu interfejsów RESTful API w wersjach ObjectId
, największą wadą jest to, że są one bardzo hałaśliwe pod względem posiadania czystego adresu URL. Będziesz albo zostawić je jako liczby HEX lub przekonwertować go do bardzo dużej liczby całkowitej, zarówno co do nieco nieprzyjazny URL:
/rest/resource/52435dbecb970072ec3a780f
/rest/resource/25459211534898951476729247759
dodałem „tytuł” do adresu URL (jak StackOverflow nie), aby uczynić je nieco bardziej przyjazny:
/rest/resource/52435dbecb970072ec3a780f/FriendlyResourceName
oczywiście, „title” jest ignorowany w oprogramowaniu, ale użytkownik widzi go psychicznie i może ignorować segment ID szalonego.
Jest bardzo mało użyteczne, które mogą być wyciągnięte z infrastruktury poprzez ich wystawienie:
- Datownik
- ID Maszyna
- Identyfikator procesu
- Losowe zwiększając wartość
Inne niż potencjalnie zbierające identyfikatory maszyn (które zwykle wskazują liczbę klientów tworzących ObjectId
s), nie ma tam zbyt wiele.
ObjectId
s nie są losowe, więc nie można ich użyć do zabezpieczenia. Zawsze będziesz musiał zabezpieczyć dane. Chociaż mogą nie rosnąć w oczywisty sposób, łatwo byłoby znaleźć inne zasoby poprzez brutalną siłę. Jeśli jednak korzystałeś z automatycznych inkrementujących się identyfikatorów, nie jest to dla ciebie nowy problem.
Jeśli wiesz, że nie tworzysz wielu nowych dokumentów w danym momencie, warto użyć jednego z wzorów here, aby utworzyć prostszy identyfikator. W jednej z aplikacji napisałem, że użyłem techniki auto-inc dla niektórych identyfikatorów dokumentów, które były wyświetlane w adresach URL, a dla tych, które były tylko Ajaxem, użyłem ObjectId
s. Naprawdę chciałem, aby niektóre adresy URL były łatwo "wpisywane". Żadna forma ObjectId
jest łatwa do wpisania przez użytkownika końcowego. To jedna z mocnych stron MongoDB - możesz użyć dowolnego formatu, który chcesz. :)
Mądrzejsze jest korzystanie z ObjectId
s, ponieważ utrzymywanie licznika inkrementującego może być wąskim gardłem. Ponadto, ponieważ ObjectId
zawiera znacznik czasu i jest monotoniczny, może być pomocny w optymalizacji zapytań.
Można się domyślić, że to ObjectIds
, ale ponieważ jest to z pewnością prawdziwe przy zwiększaniu liczby identyfikatorów, podejrzewam, że wcześniej nie polegałeś na zabezpieczeniach przez zaciemnienie, więc nie stanowi to dla ciebie problemu.
Wadą, choć niewielką, jest to, że czas utworzenia na serwerze wycieka do użytkownika, tj. Jeśli użytkownik jest w stanie zidentyfikować to jako ObjectId
, może odwrócić inżynierski czas utworzenia obiektu. To jedyny potencjalny problem, jaki widzę.
- 1. Powody, dla których Redis zwolni
- 2. Jakieś powody, aby nadal używać CVS?
- 3. Jakie są powody, dla których użycie procesora nie idzie w 100% za pomocą C# i APM?
- 4. Czy są jakieś powody używania SGML zamiast XML?
- 5. Jakieś powody, by nie używać SQLObject przez SQLAlchemy?
- 6. Powody, dla których Hibernate's sessionFactory jest bezpieczny dla wątków
- 7. Jakiekolwiek powody, dla których nie powinieneś używać dokumentu w formacie HTML 5?
- 8. Jakie są powody, dla których nie używam JRuby zamiast MRI/YARV?
- 9. Czy są jakieś przykłady kompilatorów JIT wielowątkowych?
- 10. Czy istnieją powody, dla których baza danych h2 nie powinna być wykorzystywana w produkcji?
- 11. Powody, dla których przyjęta intencja byłaby NULL w onStartCommand
- 12. Dobre powody, dla których nie należy korzystać z elementów iframe w treści strony
- 13. Czy są jakieś scenariusze, w których ostrzeżenie C4172 Visual C++ nie powinno być uważane za błąd?
- 14. Czy są jakieś sytuacje, w których kod miałby sekwencję w C++ 11, ale nie C++ 03?
- 15. Czy są jakieś dobre alternatywy dla WebSVN?
- 16. C++ 11: Czy istnieją powody, dla których niektóre typy regularne nie powinny mieć specjalizacji `std :: hash`?
- 17. Czy są jakieś alternatywy dla XmlUnit?
- 18. Jakie są powody, dla których warto wybrać SQL Server 2008 w roku 2005?
- 19. Powody, dla których warto używać OpenSL ES zamiast AudioTrack w systemie Android?
- 20. Czy są jakieś standardy kodowania dla JavaScript?
- 21. Czy są jakieś implementacje multiset dla .Net?
- 22. Czy są jakieś alternatywy dla py2exe?
- 23. Czy są jakieś cms dla Rails 4?
- 24. Jakie mogą być powody, dla których dane narzędzia Performance są wysokie. [pokazując w Xcode VM tracker]
- 25. Jakie są powody, dla których usługa ServicePointManager.ServerCertificateValidationCallback została zaprojektowana w ten sposób?
- 26. Powody, dla których NIE jest zwiększanie skali w stosunku do -out?
- 27. Czy są jakieś x, dla których SHA1 (x) jest równy x?
- 28. Dlaczego w moim projekcie Xcode są jakieś niebieskie foldery?
- 29. Jakie są powody, dla których twórcy oprogramowania piszą projekty open source?
- 30. Jakie są powody, dla których zawartość drukowania XmlDocument jest dość drukowana?
Świetna odpowiedź i podziękowania za przejrzenie niektórych zalet/wad. – welbornio