2013-09-26 9 views
11

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?

Odpowiedz

14

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:

  1. Datownik
  2. ID Maszyna
  3. Identyfikator procesu
  4. 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. :)

6

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

Świetna odpowiedź i podziękowania za przejrzenie niektórych zalet/wad. – welbornio

Powiązane problemy