2010-12-10 16 views
5

Potrzebuję identyfikatorów tekstowych w mojej aplikacji. Mamy na przykład akceptowalny zestaw znaków azAZ09 i dozwolony zakres identyfikatorów [aaa] - [cZ9]. Pierwszy wygenerowany identyfikator to aaa, a następnie aab, aac, aad e.t.c.MySQL: inkrementujący identyfikator w DB

Jak można zwrócić ID & zwiększają dolną granicę w trybie transakcyjnym? (pod warunkiem, że istnieją setki równoczesnych żądań i wszystkie powinny mieć poprawny wynik)

Aby zmniejszyć obciążenie, można zdefiniować 20 różnych zakresów i zwrócić identyfikator z zakresu losowego - powinno to zmniejszyć rywalizację, ale nie jest jasne, jak zrobić pojedynczą operację w pierwszej kolejności.

Należy również pamiętać, że liczba identyfikatorów w zasięgu może przekraczać 2^32.

Innym pomysłem jest posiadanie zakresów 64-bitowych liczb całkowitych i przeliczanie liczb całkowitych-> char id w kodzie oprogramowania, gdzie można to zrobić w sposób asynchroniczny.

Wszelkie pomysły?

+0

Nie możesz po prostu użyć typu całkowitoliczbowego i przekształcić go w razie potrzeby? – PeeHaa

+0

Tak, mogę. To jeszcze nie rozwiązuje zadania - nadal potrzebuję dozwolonych zakresów wsparcia - co oznacza, że ​​zwykła autoreklama nie wykona zadania. – BarsMonster

Odpowiedz

1

Chciałbym zadać inne pytanie, aby ułatwić rozwiązanie tego samego problemu: w jaki sposób mogę użyć funkcji m y baza danych do realizacji mojego wymagania.

Zobacz, co oferuje twoja baza danych w zakresie zarządzania sekwencjami. Niektóre z nich mogą obsługiwać coś takiego. Jeśli baza danych nie, będę patrzył na "piggy backing" na jego normalnych klawiszach numerycznych, ponieważ już rozwiązują wszystkie problemy, których się spodziewasz.

Co mam na myśli: Niech baza danych wyda klawisze numeryczne tak, jak zwykle, począwszy od 0. Następnie wpisz dwie funkcje do konwersji pomiędzy tymi liczbami a kluczami tekstowymi. Masz tu pewną elastyczność: możesz zaimplementować tę funkcję w bazie danych (używając drugiej kolumny, wyzwalaczy lub jakiejś fajnej funkcji bazy danych) lub na twojej warstwie serwerowej, takiej jak Java. To nie będzie takie skomplikowane. W końcu wszystkie bity są w każdym razie ... klucz do tekstu to inny sposób na podzielenie bitów.

Powodzenia!

+0

Doskonały pomysł na rozpoczęcie i wymaga tylko 1 stołu, teraz widzę idealne rozwiązanie :-) – BarsMonster

2

rozwiązanie oparte na long (BigInt) n, ze znakami-do-liczba i liczby na znakach konwersji dokonanych w oprogramowaniu, o - powiedzmy - 32 zróżnicowanych zakresów

  • utworzenie 32 tabelach range0 .. range31 do obniżenia obciążenia (unikalna tabela z 32 polami zakresu ma zablokowany wiersz za każdym razem, gdy zostanie zapisany zakres)

  • uruchamianie zakresów przez ustawienie wartości auto_increment na bardzo wysoką wartość na 64 bitach - może 63, jeśli chcesz uniknąć problemu ze znakiem w swojej aplikacji. Idealnie wartość zakresu na 5 bitach, od 0 do 31. 1 znak bitowy + zakres 5 bitów = 6 bitów. Licznik będzie od 1 do (2^58-1) lub 10^17 ... to powinno wystarczyć.

  • w oprogramowaniu liczba zakres jest wybierany losowo, a zapytania nazwa tabela jest odpowiednio zbudowany range I, gdzie i idzie od 0 do 31.

tworzyć polecenia tabele byłoby coś jak na przykład w Javie

String table; 
    String query; 
    long increment; 

    for (long i=0 ; i<32 ; i++) { 
    table = "range"+i; 
    increment = (i<<58) + 1; 
    query = "CREATE TABLE "+table+" (v bigint auto_increment primary key) auto_increment="+increment; 

    do_query(query); 
    } 
+0

Hmm ... Interesujące, ale jak sobie poradzę z zakresami, które powiedzmy 100 liczb? – BarsMonster

+0

@BarsMonster Zamiast 32, to byłoby 128, 2^7 (0..127), '(i << 58)' byłoby '(i << 56)' (wciąż około 10^16 możliwych wartości). –

+0

Oczywiście można użyć tylko jednej tabeli ... (zastąp 'i <32'' i <1' :-) - ideą złożoności 2^x auto_increment było zmniejszenie jednoczesnego dostępu do tej samej automatyki inkrementowana tabela, a więc częstotliwość * blokowania *. W ten sposób masz klucze, które są wielokrotne, aczkolwiek unikalne. –

Powiązane problemy