2012-09-16 14 views
9

Mam bazę danych używaną przez kilku klientów. Tak naprawdę nie chcę, aby zastępcze przyrostowe wartości kluczy spadały między klientami. Chcę, aby numeracja zaczynała się od 1 i była specyficzna dla klienta.Najlepsze podejście do kluczy głównych wielu dzierżawców

Będę używał dwuczęściowego klucza złożonego z tenant_id oraz identyfikatora przyrostowego.

Jaki jest najlepszy sposób tworzenia klucza przyrostowego na jednego dzierżawcę?

Używam programu SQL Server Azure. Obawiam się blokowania tabel, duplikowania kluczy itp. Zazwyczaj ustawiłem klucz podstawowy na TOŻSAMOŚĆ i poruszałem się dalej.

Dzięki

+0

"Naprawdę nie chcę, aby zastępcze przyrostowe wartości kluczowe spadały między klientami ..." Jestem ciekawa, dlaczego tego nie chcesz? –

+2

Głównie dlatego, że dadzą ludziom pojęcie o tym, ile rzędów zajmuję, w moim utopijnym świecie powinny one być całkowicie odgrodzone od siebie. –

+2

W rzeczywistości możesz mieć oba - zastępczy klucz podstawowy dla integralności referencyjnej (ukryty przed klientami) i unikalne indeksy dwukolumnowe, np .: (Cust_id, Order_Number) – alexm

Odpowiedz

2

Planujesz użyciem SQL Azure Federacje w przyszłości? Jeśli tak, bieżąca wersja programu SQL Azure Federations nie obsługuje użycia TOŻSAMOŚCI jako części indeksu klastrowego. Więcej szczegółów można znaleźć w tej wersji: What alternatives exist to using guid as clustered index on tables in SQL Azure (Federations).

Jeśli jeszcze nie oglądałeś federacji, możesz to sprawdzić, ponieważ zapewnia on interesujący sposób zarówno fragmentacji bazy danych, jak i izolacji najemców w bazie danych.

W zależności od celu końcowego, za pomocą federacji można użyć identyfikatora GUID jako podstawowego indeksu klastrowego w tabeli, a także użyć przyrostowego pola IDENTYFIKACJI INT w tabeli. To pole identyfikacji ID INTEL jest widoczne dla użytkowników końcowych. Jeśli tworzysz federację na TenantID, każdy "Tabela najemców" staje się silosem (co przynajmniej rozumiem), więc użycie TOŻSAMOŚCI na polu w tej tabeli byłoby efektywnie rosnącą wartością automatyczną, która wzrasta w obrębie danego Najemcy. .

Kiedy \ jeśli dane zostaną scalone (łącząc dane od wielu Najemców), zakończy się kolizja na tym polu IDENTYFIKACJI INT (stąd dlaczego IDENTYFIKACJA nie jest obsługiwana jako klucz podstawowy w federacjach), ale dopóki nie jesteś Używając tego pola jako unikalnego identyfikatora w systemie, powinieneś być w porządku.

1

Jeśli chcesz skopiować wygodę posiadania przypisanego automatycznie unikalnego klucza INT po wstawieniu, możesz dodać wyzwalacz INSTEAD OF INSERT, który używa MAX istniejącej kolumny +1 w celu ustalenia następnej wartości.

Jeśli kolumna z wartością tożsamości jest pierwszym kluczem w indeksie, zapytanie MAX będzie prostym wyszukiwaniem indeksu, bardzo wydajnym.

Transakcje zapewniają przypisanie unikalnych wartości, ale to podejście będzie miało inne semantyki blokowania niż standardowa kolumna tożsamości. IIRC, SQL Server może przydzielić inną wartość tożsamości dla każdej transakcji, która zażąda go równolegle, a jeśli transakcja zostanie wycofana, wartości przypisane do niej są odrzucane. Podejście MAX pozwoli tylko na jedną transakcję wstawiania wierszy do tabeli na raz.

Podejściem pokrewnym może być posiadanie dedykowanej tabeli wartości kluczy wpisywanej przez nazwę tabeli, identyfikator dzierżawcy i bieżącą wartość tożsamości. Wymagałoby to tego samego wyzwalacza INSTEAD OF INSERT i większej liczby elementów, aby można było wyszukiwać i aktualizować tę tabelę kluczy. Nie usprawniłoby to jednak operacji równoległych; zamek byłby po prostu na innym stole.

Jedną z możliwości naprawienia wąskiego gardła blokującego byłoby włączenie bieżącego SPID do wartości klucza (teraz klucz tożsamości jest kombinacją sekwencyjnego int i tego, co przydzielił mu SPID, a nie po prostu sekwencyjny), użyj dedykowanej tożsamości tabelę wartości i wstaw tam rekordy według SPID, jeśli to konieczne; tabela tożsamości PK będzie (nazwa tabeli, dzierżawca, SPID) i mieć kolumnę bez klucza z bieżącą wartością sekwencyjną. W ten sposób każdy identyfikator SPID będzie miał swoją własną, przydzielaną dynamicznie pulę tożsamości i będzie miał zablokowane tylko własne rekordy SPID.

Kolejną wadą jest utrzymywanie wyzwalaczy, które należy aktualizować za każdym razem, gdy zmienia się kolumny w dowolnej ze specjalnych tabel tożsamości.