Sto usando mongoDB per la prima volta in un servizio RESTful. Precedentemente la colonna id nei miei database SQL era un intero incrementale, quindi i miei endpoint RESTful avrebbero avuto un aspetto simile a /rest/objectType/1
. C'è qualche ragione per cui non dovrei usare solo ObjectId di mongoDB nello stesso ruolo, o è più saggio mantenere una colonna ID integer incrementale separata e usarla per gli URL?Ci sono motivi per cui dovrei/non dovrei usare ObjectId nelle URL del mio RESTful
risposta
Dopo aver utilizzato ObjectId
s in API RESTful diverse volte, il più grande svantaggio è in realtà che sono molto rumorosi in termini di avere un URL pulito. Potrete sia lasciarlo come un numero esadecimale, o convertirlo in un grande numero intero, sia rendendo per un po 'ostile URL:
/rest/resource/52435dbecb970072ec3a780f
/rest/resource/25459211534898951476729247759
Ho aggiunto un "titolo" per l'URL (come StackOverflow fa) per renderli un po 'più amichevole:
/rest/resource/52435dbecb970072ec3a780f/FriendlyResourceName
Naturalmente, il "titolo" è ignorato nel software, ma l'utente vede e può mentalmente ignorare il segmento ID pazzo.
C'è molto poco utile che potrebbe essere imparato dalle infrastrutture esponendoli:
- timestamp
- ID macchina
- Process ID
- a caso valore incrementando
Tranne potenzialmente in grado di raccogliere gli ID macchina (che in genere indicano il numero di client che creano ObjectId
s), non c'è molto lì.
ObjectId
s non sono casuali, quindi non è possibile utilizzarli per sicurezza. Avrai sempre bisogno di proteggere i dati. Sebbene non possano incrementare in modo evidente, sarebbe facile trovare altre risorse attraverso la forza bruta. Tuttavia, se in precedenza si utilizzavano ID di incremento automatico, questo non rappresenta un nuovo problema.
Se si sa che non si stanno creando molti nuovi documenti in un dato momento, potrebbe valere la pena di utilizzare uno dei modelli here per creare un ID più semplice. In una app che ho scritto, ho usato una tecnica di auto-inc per alcuni degli ID dei documenti mostrati negli URL, e per quelli che erano solo Ajax, ho usato ObjectId
s. Volevo davvero che alcuni URL venissero facilmente "digitati". Nessuna forma di ObjectId
è facilmente digitata da un utente finale. Questo è uno dei punti di forza di MongoDB: puoi utilizzare qualsiasi formato _id
che desideri. :)
È più saggio utilizzare ObjectId
s, perché mantenere un contatore incrementale può essere un collo di bottiglia. Inoltre, poiché ObjectId
contiene un timestamp ed è monotono, possono essere utili per ottimizzare le query.
ObjectIds
Il ObjectIds
può essere indovinato, ma poiché ciò è sicuramente vero per l'incremento degli ID, sospetto che non abbiate fatto affidamento sulla sicurezza attraverso l'oscurità prima, quindi non è un problema per voi.
Uno svantaggio, anche se di dimensioni ridotte, è che il tempo di creazione sul server passa all'utente, ovvero se l'utente è in grado di identificarlo come ObjectId
, può decodificare il tempo di creazione dell'oggetto. Questo è l'unico potenziale problema che vedo.
- 1. Ci sono motivi per cui l'idioma StringPiece/StringRef non è più popolare?
- 2. Ci sono motivi per cui uno sviluppatore C# dovrebbe imparare Emacs/Vim?
- 3. Ci sono motivi per cui il database h2 non dovrebbe essere usato in produzione?
- 4. Per quali motivi dovrei usare Expression Blend su XAML Designer?
- 5. Ci sono dei buoni motivi per usare lo spostamento dei bit, ad eccezione della matematica veloce?
- 6. Motivi per cui Redis rallenta
- 7. Quali sono alcuni motivi per cui jquery .focus() non funziona?
- 8. motivi per non usare typekit?
- 9. Quali sono i casi in cui NON dovrei usare FragmentManager's executePendingTransactions() (all'interno del thread principale)?
- 10. ObjectID Mongo: sicuro da usare in natura?
- 11. API RESTful: dove dovrei codificare il mio flusso di lavoro?
- 12. Posso/dovrei usare YAML come carico utile nel webservice RESTful?
- 13. Quando dovrei usare le parentesi nelle istruzioni require/include?
- 14. progettazione URL per servizi RESTful
- 15. Quale libreria JavaScript dovrei usare per analizzare i parametri URL?
- 16. In Java, perché gli oggetti array sono? Ci sono dei motivi specifici?
- 17. Motivi per usare le alternative lex/yacc?
- 18. Vantaggi di URL RESTful
- 19. Come dovrei usare Celery quando i risultati dell'attività sono grandi?
- 20. In C#, ci sono delle eccezioni built-in che non dovrei usare?
- 21. Come convertire URL inURI quando ci sono caratteri imprudenti?
- 22. Il mio script funziona bene, ma sono confuso sul motivo per cui devo usare utf8_decode()
- 23. Quando dovrei usare AQL?
- 24. Quale metodo dovrei usare per avviare manualmente il mio AngularJS?
- 25. Perché non dovrei usare un carattere jolly nel mio classpath?
- 26. Motivo per cui Odoo è lento quando ci sono enormi dati all'interno del database
- 27. Ci sono ragioni per non usare lombok con Android Studio
- 28. Ci sono situazioni in cui i test unitari sono dannosi per il codice?
- 29. Quali motivi avrei per non usare JRuby su MRI/YARV?
- 30. Ci sono motivi per non memorizzare valori booleani in SQL come tipi di dati bit?
Ottima risposta, e grazie per aver esaminato alcuni dei pro/contro. – welbornio