Obecnie pracuję nad prototypem systemu rejestracji. Jest to bardzo uproszczone i zasadniczo jest po prostu formą .NET, która zostaje zapisana w MongoDB.Efektywne generowanie pojedynczych kluczy dla wpisów bazy danych
Co utknąłem jest skutecznym sposobem na wygenerowanie unikalnego identyfikatora/klucza dla każdego użytkownika. Te identyfikatory muszą być przyjazne dla ludzi, więc powinny zawierać ciąg znaków alfanumerycznych o długości 7 znaków, np. A1B2C3X.
Rozwiązania, które do tej pory widziałem, używają prostej funkcji do generowania losowego ciągu znaków, a następnie sprawdzania bazy danych, aby sprawdzić, czy jest ona unikatowa (a jeśli nie, powtórz, dopóki nie znajdziesz unikalnej). To oczywiście będzie coraz bardziej kosztowne obliczeniowo, ponieważ liczba pozycji w bazie danych rośnie.
Mój pomysł polega na wstępnym obliczeniu unikalnego zestawu identyfikatorów i zapisaniu go w innej bazie danych. Następnie, gdy muszę dodać nowy wpis do bazy danych użytkownika, mogę "pop" id z mojego id danych (w stałym czasie) i wiem, że nie istnieje on już w bazie danych użytkownika bez konieczności wyszukiwania go.
Jestem pewna, że ktoś musiał wcześniej coś takiego zrobić. Czy istnieje lepszy sposób? Nie wiem, dlaczego tak bardzo się z tym zmagam. Twój wkład jest bardzo doceniany.
Czy ObjectId, dostarczony przez sterownik MongoDB jest zbyt ludzki nieprzyjazny dla twojego przypadku użycia? –
Chciałem zasugerować, co zasugerował @EkinKoc (a jeśli masz 40 postaci, to jest sposób, aby przejść). Ale jeśli potrzebujesz dokładnie 7 znaków, metoda, którą obrysowujesz, powinna być * mniej kosztowna *, prostsza i mniej podatna na błędy niż posiadanie osobnego pliku kluczy db, aby wyskakiwać wartości. Szansa na kolizję losowego 7-znakowego ciągu alfanumerycznego jest praktycznie zerowa. Jest to rzadki przypadek, którego nie należy optymalizować. (Poza tym tworzenie użytkowników jest rzadkością, kontrola unikalności db jest wystarczająco szybka dla stosunkowo rzadkiego procesu). –
@BenLee: prawdopodobieństwo kolizji zmienia się ze skalą :) –