Ich verwende mongoDB zum ersten Mal in einem RESTful-Service. Zuvor war die ID-Spalte in meinen SQL-Datenbanken eine inkrementierende Ganzzahl, sodass meine RESTful-Endpunkte ungefähr wie /rest/objectType/1
aussehen würden. Gibt es irgendeinen Grund, warum ich nicht die Objekt-IDs von mongoDB in der gleichen Rolle verwenden sollte, oder ist es sinnvoller, eine separate Inkrementierungs-Integer-ID-Spalte zu pflegen und diese für URLs zu verwenden?Gibt es irgendwelche Gründe, warum ich ObjectId in meiner RESTful-URL nicht verwenden sollte
Antwort
Nachdem ObjectId
s in RESTful-APIs mehrmals verwendet wurde, ist der größte Nachteil, dass sie in Bezug auf eine saubere URL sehr laut sind. Sie werden entweder als HEX-Zahl verlassen, oder es auf eine sehr große ganze Zahl konvertieren, sowohl was für eine etwas unfreundlich URL:
/rest/resource/52435dbecb970072ec3a780f
/rest/resource/25459211534898951476729247759
ich einen „Titel“ der URL hinzugefügt haben (wie Stackoverflow sie etwas freundlicher ist) zu machen:
/rest/resource/52435dbecb970072ec3a780f/FriendlyResourceName
natürlich ist der „Titel“ in der Software ignoriert, aber der Benutzer sieht es und kann mental die verrückte ID Segment ignorieren.
Es gibt sehr wenig nützlich, die von der Infrastruktur durch Aussetzen sie gelernt werden könnte:
- Zeitmarke
- Machine ID
- Prozess-ID
- Zufall Inkrementieren Wert
Andere als möglicherweise Sammeln von Computer-IDs (die normalerweise die Anzahl der Clients angeben, dieerstellens), da ist nicht viel.
s sind nicht zufällig, Sie können sie also nicht zur Sicherheit verwenden. Sie müssen immer die Daten sichern. Während sie sich nicht auf eine naheliegende Weise erhöhen, wäre es leicht, andere Ressourcen durch rohe Gewalt zu finden. Wenn Sie jedoch zuvor automatisch inkrementierende IDs verwendet haben, ist dies kein neues Problem für Sie.
Wenn Sie wissen, dass Sie zu einem bestimmten Zeitpunkt nicht viele neue Dokumente erstellen, kann es sinnvoll sein, eines der Muster here zu verwenden, um eine einfachere ID zu erstellen. In einer App, die ich geschrieben habe, verwendete ich für einige der Dokument-IDs, die in URLs angezeigt wurden, eine Auto-Inc-Technik, und für diejenigen, die nur Ajax waren, verwendete ich ObjectId
s. Ich wollte wirklich, dass einige URLs leicht "getippt" werden. Kein Formular ist leicht von einem Endbenutzer getippt. Das ist eine der Stärken von MongoDB - dass Sie jedes gewünschte Format verwenden können. :)
Es ist klüger, die s zu verwenden, da das Aufrechterhalten eines inkrementierenden Zählers einen Engpass darstellen kann. Da ObjectId
außerdem einen Zeitstempel enthält und monoton ist, können sie bei der Optimierung von Abfragen hilfreich sein.
Die ObjectIds
kann erraten werden, aber da dies definitiv für die Erhöhung von IDs gilt, vermute ich, dass Sie sich nicht auf Sicherheit durch Unklarheit vorher verlassen haben, also ist das kein Problem für Sie.
Ein Nachteil, wenn auch ein kleiner, ist, dass die Erstellungszeit auf Ihrem Server an den Benutzer leckt, d.h. wenn der Benutzer dies als ObjectId
identifizieren kann, kann sie die Erstellungszeit des Objekts zurückentwickeln. Das ist das einzige potenzielle Problem, das ich sehe.
- 1. Gibt es irgendwelche Gründe, "this" ("Self", "Me", ...) nicht zu verwenden?
- 2. Gibt es irgendwelche Gründe, warum ein C# -Entwickler Emacs/Vim lernen sollte?
- 3. Gibt es Gründe, warum die h2-Datenbank nicht in der Produktion verwendet werden sollte?
- 4. Gibt es Gründe, Boost :: shared_ptrs nicht zu verwenden?
- 5. Gibt es Gründe, nicht mit Android Studio Lombok zu verwenden
- 6. Gibt es irgendwelche Gründe, warum C++ Vorlagenpakete mit std :: tuple übergeben werden
- 7. Gibt es einen Grund, warum ich NVARCHAR nicht in Sql Server verwenden sollte?
- 8. In Java, warum sind Arrays Objekte? Gibt es bestimmte Gründe?
- 9. Warum sollte ich UNIVERSAL :: isa nicht verwenden?
- 10. Warum sollte ich die Elementinitialisierungsliste verwenden?
- 11. Warum sollte ich atoi() nicht verwenden?
- 12. Warum sollte ich AutoDual nicht verwenden?
- 13. Ausführungszeit Unterschiede, gibt es irgendwelche?
- 14. Gründe, warum PHP Mail möglicherweise nicht funktioniert
- 15. Warum sollte ich nicht Unity verwenden?
- 16. Warum sollte ich glBindAttribLocation verwenden?
- 17. Gründe, nicht tf.train.AdamOptmizer zu verwenden?
- 18. Sollte ich Parse in meiner andorid App verwenden?
- 19. Gibt es Gründe, die CSS-Regel "@import" noch zu verwenden?
- 20. Sollte ich FxCop verwenden und warum?
- 21. Gibt es irgendwelche StackExchange.Redis-Beispielprojekte?
- 22. Warum sollte ich Datetime in SQL verwenden?
- 23. Warum sollte ich io_service :: work verwenden?
- 24. Gibt es irgendwelche Guava-Übersichten?
- 25. Gibt es Gründe, warum das StringPiece/StringRef-Idiom nicht beliebter ist?
- 26. Warum sollte ich LabelFor in MVC verwenden?
- 27. Sollte ich `app.exec()` oder `app.exec _()` in meiner PyQt-Anwendung verwenden?
- 28. Gibt es irgendwelche Clojure DSLs?
- 29. Gibt es irgendwelche unbenutzten Symbole in Python?
- 30. Android: Warum sollte ich keine Aktivitäten in Tabs verwenden?
Große Antwort, und danke für einige Pros/Nachteile gehen. – welbornio