Złożone klucze podstawowe a unikalne pole ID obiektu

Odziedziczyłem bazę danych zbudowaną z myślą, że klucze złożone są o wiele bardziej idealne niż użycie pola unique object ID i że podczas budowania bazy danych pojedynczy unikalny identyfikator powinien nigdy Być używany jako klucz podstawowy. Ponieważ budowałem front-end Rails dla tej bazy danych, napotkałem trudności z uzyskaniem zgodności z konwencjami Rails (chociaż było to możliwe przy użyciu niestandardowych widoków i kilku dodatkowych klejnotów do obsługi kluczy kompozytowych).

Rozumowanie za tym specyficznym schematem od osoby, która go napisała miał do czynienia z tym, jak Baza Danych obsługuje pola ID w nieefektywny sposób i kiedy buduje indeksy, rodzaje drzew są wadliwe. W tym wyjaśnieniu brakowało głębi i nadal staram się ogarnąć tę koncepcję (znam się na używaniu klawiszy kompozytowych, ale nie w 100% przypadków).

Czy ktoś może wypowiedzieć się na ten temat lub dodać jakąś większą głębię?

Author: Brian, 2008-10-01

15 answers

Większość powszechnie używanych silników (MS SQL Server, Oracle, DB2, MySQL, itp.) nie doświadczyłby zauważalnych problemów przy użyciu zastępczego systemu klucza. Niektórzy mogą nawet doświadczyć zwiększenia wydajności dzięki użyciu zastępczego, ale problemy z wydajnością są bardzo specyficzne dla platformy.

Ogólnie rzecz biorąc, klucz naturalny (a co za tym idzie, klucz złożony) ma długą historię bez prawdopodobnej "właściwej odpowiedzi" w zasięgu wzroku.

Argumenty dla kluczy naturalnych (liczba pojedyncza lub złożone) zazwyczaj zawierają niektóre z następujących:

1) są one już dostępne w modelu danych. Większość jednostek modelowanych już zawiera jeden lub więcej atrybutów lub kombinacji atrybutów, które spełniają potrzeby klucza do celów tworzenia relacji. Dodanie dodatkowego atrybutu do każdej tabeli wiąże się z niepotrzebną nadmiarowością.

2) eliminują one potrzebę pewnych połączeń. na przykład, jeśli masz klientów z kodami klientów, i faktury z numerami faktur (z których oba są "naturalnymi" kluczami), i chcesz odzyskać wszystkie numery faktur dla konkretnego kodu klienta, możesz po prostu użyć "SELECT InvoiceNumber FROM Invoice WHERE CustomerCode = 'XYZ123'". W klasycznym podejściu do klucza zastępczego, SQL wyglądałby mniej więcej tak: "SELECT Invoice.InvoiceNumber FROM Invoice INNER JOIN Customer ON Invoice.CustomerID = Customer.CustomerID WHERE Customer.CustomerCode = 'XYZ123'".

3) przyczyniają się one do bardziej uniwersalnego podejścia do modelowania danych. z kluczami naturalnymi, ten sam projekt może być używany w dużej mierze bez zmian między różnymi silnikami SQL. Wiele zastępczych kluczowych podejść wykorzystuje specyficzne techniki silnika SQL do generowania kluczy, co wymaga większej specjalizacji modelu danych do wdrożenia na różnych platformach.

Argumenty dla kluczy zastępczych Zwykle obracają się wokół problemów, które są specyficzne dla silnika SQL:

1) umożliwiają one łatwiejsze zmiany atrybutów, gdy zmieniają się wymagania/reguły biznesowe. dzieje się tak, ponieważ pozwalają one na wyodrębnienie atrybutów danych do jednej tabeli. Jest to przede wszystkim problem dla silników SQL, które nie wydajnie zaimplementuj standardowe konstrukcje SQL, takie jak domeny. Gdy atrybut jest zdefiniowany przez instrukcję domeny, zmiany atrybutu mogą być wykonywane w całym schemacie za pomocą instrukcji ALTER DOMAIN. Różne silniki SQL mają różne charakterystyki wydajności dla zmiany domeny, a niektóre silniki SQL nie implementują domen w ogóle, więc modelarze danych kompensują te sytuacje poprzez dodanie kluczy zastępczych w celu poprawy zdolności do wprowadzania zmian do atrybutów.

2) umożliwiają łatwiejsze implementacje współbieżności niż klucze naturalne. W przypadku klucza naturalnego, jeśli dwóch użytkowników pracuje jednocześnie z tym samym zestawem informacji, takim jak wiersz klienta, a jeden z użytkowników modyfikuje wartość klucza naturalnego, aktualizacja przez drugiego użytkownika nie powiedzie się, ponieważ kod klienta, który aktualizuje, nie istnieje już w bazie danych. W przypadku klucza zastępczego aktualizacja przebiegnie pomyślnie, ponieważ niezmienne wartości ID są używane do identyfikacji wierszy w bazie danych, a nie zmienne kody klientów. Jednak nie zawsze jest pożądane Zezwolenie na drugą aktualizację – jeśli kod klienta zmienił się, możliwe jest, że drugi użytkownik nie powinien mieć możliwości kontynuowania zmiany, ponieważ zmieniła się rzeczywista "tożsamość" wiersza – drugi użytkownik może aktualizować niewłaściwy wiersz. Ani klucze zastępcze, ani klucze naturalne same w sobie nie rozwiązują tego problemu. Kompleksowe rozwiązania współbieżności muszą być rozwiązywane poza implementacją klucza.

3) [[9]}działają lepiej niż naturalne klucze.[10]} na wydajność ma największy bezpośredni wpływ silnik SQL. Ten sam schemat bazy danych zaimplementowany na tym samym sprzęcie przy użyciu różnych silników SQL często ma dramatycznie różne charakterystyki wydajności, ze względu na mechanizmy przechowywania i pobierania danych z silników SQL. Niektóre silniki SQL zbliżają się do systemów plików płaskich, gdzie dane są faktycznie przechowywane redundantnie, gdy ten sam atrybut, taki jak kod klienta, pojawia się w wielu miejscach w schemacie bazy danych. To nadmiarowe przechowywanie przez silnik SQL może powodować problemy z wydajnością, gdy konieczne są zmiany w danych lub schemacie. Inne silniki SQL zapewniają lepszą separację między modelem danych a systemem przechowywania/pobierania, umożliwiając szybszą zmianę danych i schematu.

4) Klucze zastępcze działają lepiej z pewnymi bibliotekami dostępu do danych i frameworkami GUI. ze względu na jednorodność większości wzorów kluczy zastępczych (przykład: wszystkie relacyjne klucze są liczbami całkowitymi), biblioteki dostępu do danych, ORMs i frameworki GUI mogą pracować z informacjami bez potrzeby specjalnej wiedzy o danych. Klucze naturalne, ze względu na ich niejednorodny charakter (różne typy danych, Rozmiar itp.), nie działają tak dobrze ze zautomatyzowanymi lub półautomatycznymi zestawami narzędzi i bibliotekami. W przypadku specjalistycznych scenariuszy, takich jak wbudowane bazy danych SQL, projektowanie bazy danych z myślą o konkretnym zestawie narzędzi może być dopuszczalne. W innych scenariuszach bazy danych są informacjami korporacyjnymi zasoby, dostępne jednocześnie przez wiele platform, aplikacji, systemów raportowania i urządzeń, a zatem nie działają tak dobrze, gdy są projektowane z naciskiem na konkretną bibliotekę lub framework. Ponadto bazy danych zaprojektowane do pracy z określonymi zestawami narzędzi stają się odpowiedzialnością, gdy wprowadzany jest następny wielki zestaw narzędzi.

Zazwyczaj padam na stronę klawiszy naturalnych (oczywiście), ale nie jestem fanatykiem. Ze względu na środowisko, w którym pracuję, w którym każda dana baza danych pomagam design może być używany przez różne aplikacje, używam kluczy naturalnych do większości modelowania danych i rzadko wprowadzam surogaty. Jednak nie idę z drogi, aby spróbować ponownie zaimplementować istniejące bazy danych, które używają zastępczych. Zastępcze-kluczowe systemy działają dobrze – nie trzeba zmieniać czegoś, co już działa dobrze.

Istnieje kilka doskonałych zasobów omawiających zalety każdego podejście:

Http://www.google.com/search?q=natural + klucz+zastępczy + klucz

Http://www.agiledata.org/essays/keys.html

Http://www.informationweek.com/news/software/bi/201806814

 85
Author: JeremyDWill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-30 18:59:12

Pracuję nad aplikacjami bazodanowymi od 15 lat i jeszcze nie spotkałem się z przypadkiem, w którym klucz zastępczy był lepszym Wyborem niż klucz zastępczy.

Nie mówię, że taki przypadek nie istnieje, mówię tylko, że gdy uwzględnisz praktyczne kwestie związane z tworzeniem aplikacji, która uzyskuje dostęp do bazy danych, Zwykle korzyści z klucza zastępczego zaczynają przytłaczać teoretyczną czystość kluczy innych niż zastępcze.

 31
Author: Darrel Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 19:05:54

Klucz podstawowy powinien być stały i bezsensowny ; klucze nie zastępcze zwykle nie spełniają jednego lub obu wymagań, ostatecznie

  • Jeśli klucz nie jest stały, w przyszłości pojawi się problem z aktualizacją, który może być dość skomplikowany

  • Jeśli klucz nie jest bez znaczenia, to jest bardziej prawdopodobne, że się zmieni, tzn. nie będzie stały; patrz powyżej

Weźmy prosty, powszechny przykład: tabelę pozycji inwentarza. Może być kuszące, aby Numer Pozycji (sku numer, kod kreskowy, kod części, czy cokolwiek) klucz główny, ale rok później wszystkie numery pozycji zmieniają się {[2] } i zostajesz z bardzo niechlujnym problemem aktualizacji całej bazy danych...

EDIT: jest dodatkowa kwestia, która jest bardziej praktyczna niż filozoficzna. W wielu przypadkach znajdziesz w jakiś sposób konkretny wiersz, a następnie zaktualizuj go lub znajdź ponownie (lub oba). W przypadku kluczy złożonych jest więcej danych do śledzenia i więcej kontraktów w klauzuli WHERE dla ponownego znalezienia lub uaktualnić (lub usunąć). Możliwe jest również, że jeden z kluczowych segmentów mógł się w międzyczasie zmienić!. W przypadku klucza zastępczego zawsze jest tylko jedna wartość do zachowania (identyfikator zastępczy) i z definicji nie może się zmienić, co znacznie upraszcza sytuację.

 20
Author: Steven A. Lowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-05 15:52:27

To brzmi tak, jakby osoba, która stworzyła bazę danych, znajdowała się po stronie kluczy naturalnych w wielkiej debacie klucze naturalne kontra klucze zastępcze.

Nigdy nie słyszałem o żadnych problemach z btrees na polach ID, ale również nie studiowałem go w żadnej dużej głębi...

Spadam na stronę klucza zastępczego: masz mniej powtórzeń podczas używania klucza zastępczego, ponieważ powtarzasz tylko jedną wartość w innych tabelach. Ponieważ ludzie rzadko dołączają do stolików ręcznie, nie obchodzi nas, czy to numer albo nie. Ponadto, ponieważ w indeksie jest tylko jedna kolumna o stałym rozmiarze, można bezpiecznie założyć, że surogaci mają szybszy czas wyszukiwania według klucza podstawowego.

 11
Author: Powerlord,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 18:53:37

Używanie pól 'unique (object) ID' upraszcza łączenie, ale powinieneś dążyć do tego, aby drugi (prawdopodobnie złożony) klucz był nadal unikalny - nie zmniejszaj ograniczeń not-null i zachowuj unikalne ograniczenie.

Jeśli DBMS nie może skutecznie obsługiwać unikalnych liczb całkowitych, ma duże problemy. Jednak użycie zarówno "unique (object) ID", jak i drugiego klucza wymaga więcej miejsca (dla indeksów) niż tylko drugiego klucza i ma dwa indeksy do aktualizacji przy każdej operacji wstawiania. Więc to nie jest freebie ... ale tak długo, jak zachowasz oryginalny klucz, to będzie dobrze. Jeśli wyeliminujesz drugi klucz, łamiesz konstrukcję swojego systemu; całe piekło w końcu się uwolni (i możesz, ale nie możesz zauważyć, że piekło się uwolniło).

 5
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 18:46:05

W zasadzie jestem członkiem zespołu kluczy zastępczych i nawet jeśli doceniam i Rozumiem argumenty, takie jak te przedstawione tutaj przez JeremyDWill, nadal szukam przypadku, w którym klucz "naturalny" jest lepszy niż klucz zastępczy ...

Inne posty zajmujące się tym zagadnieniem zwykle odnoszą się do teorii relacyjnych baz danych i wydajności baz danych. Innym interesującym argumentem, zawsze zapomnianym w tym przypadku, jest normalizacja tabeli i produktywność kodu :

Za każdym razem, gdy tworzę tabelę, tracić czas

  1. identyfikowanie klucza głównego i jego właściwości fizyczne (rodzaj, Rozmiar)
  2. zapamiętanie tych cech za każdym razem chcę się do niego odnieść w mój kod?
  3. Wyjaśnienie mojego wyboru PK innym Programiści w zespole?

Moja odpowiedź brzmi nie na wszystkie te pytania:

  1. nie mam czasu do stracenia próbując określ "najlepszy klucz podstawowy", gdy / align = "left" / osób.
  2. nie chcę pamiętać, że Klucz podstawowy mojej tabeli" computer" jest ciągiem o długości 64 znaków (czy Windows akceptuje, że wiele znaków dla nazwy komputera?).
  3. nie chcę tłumaczyć mojego wyboru do innych deweloperów, gdzie jeden z nich w końcu powie "tak stary, ale weź pod uwagę, że musisz zarządzać Komputery nad różnymi domenami? Czy ten ciąg 64 znaków pozwala aby zapisać nazwę domeny + nazwa komputera?".

Więc pracowałem przez ostatnie pięć lat z bardzo podstawową zasadą: każda tabela (nazwijmy ją " myTable") ma swoje pierwsze pole o nazwie " id_MyTable", które jest typu uniqueIdentifier. Nawet jeśli ta tabela obsługuje relację "many-to-many", taką jak Tabela' ComputerUser', gdzie kombinacja ' id_Computer 'i' id_User 'tworzy bardzo akceptowalny klucz podstawowy, wolę utworzyć To pole' id_ComputerUser ' jako uniqueIdentifier, aby trzymać się reguły.

Główną zaletą jest to, że nie musisz przejmować się używaniem Klucz podstawowy i / lub klucz obcy w Twoim kodzie. Gdy już masz nazwę tabeli, znasz nazwę PK i wpisz. Gdy dowiesz się, które łącza są zaimplementowane w twoim modelu danych, poznasz nazwę dostępnych kluczy obcych w tabeli.

Nie jestem pewien, czy moja zasada jest najlepsza. Ale jest bardzo skuteczny!
 5
Author: Philippe Grondier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-29 17:55:51

Używanie klawiszy naturalnych sprawia, że korzystanie z dowolnego automatycznego ORM jako warstwy trwałości jest koszmarem. Ponadto klucze obce w wielu kolumnach mają tendencję do nakładania się na siebie, co spowoduje dalszy problem podczas nawigowania i aktualizowania relacji w sposób OO.

Nadal można przekształcić klucz naturalny w unikalny ogranicznik i dodać automatycznie wygenerowany identyfikator; to nie usuwa problemu z kluczami obcymi, choć te będą musiały być zmieniane ręcznie; miejmy nadzieję, że wiele kolumn i nakładające się ograniczenia będą mniejszością wszystkich relacji, więc możesz skoncentrować się na refaktoryzacji tam, gdzie ma to największe znaczenie.

Naturalne pk mają swoją motywację i zwyczaje i nie są złe (tm), po prostu mają tendencję do nie dogadywania się dobrze z ORM.

Moje odczucie jest takie, że jak wszystkie inne pojęcia, klucze naturalne i normalizacja tabel powinny być używane, gdy są rozsądne, a nie jako ślepe ograniczenia projektowe

 3
Author: Lorenzo Boccaccia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 18:55:51

Powiem krótko i słodko: Dodaj zastępcze dowolne klucze, jeśli możesz i utrzymuj bieżące Schematy kluczy za pomocą unikalnych ograniczeń. ORM jest szczęśliwy, ty jesteś szczęśliwy, oryginalny programista nie-taki-szczęśliwy, ale jeśli nie jest twoim szefem, to może sobie z tym poradzić.

 3
Author: MattC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 19:29:18

Praktycznym podejściem do tworzenia nowej architektury jest takie, które wykorzystuje klucze zastępcze dla tabel, które będą zawierać tysiące wielokolumnowych rekordów i klucze złożone dla krótkich tabel opisowych. Zwykle stwierdzam, że uczelnie dyktują użycie kluczy zastępczych, podczas gdy programiści z prawdziwego świata wolą klucze złożone. Naprawdę musisz zastosować odpowiedni typ klucza podstawowego do tabeli - nie tylko w ten czy inny sposób.

 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 20:33:13

Klucze złożone mogą być dobre - mogą wpływać na wydajność - ale nie są jedyną odpowiedzią, tak samo jak unikalny (zastępczy) klucz nie jest jedyną odpowiedzią.

Martwi mnie niejasność w rozumowaniu przy wyborze kluczy złożonych. Najczęściej niejasność w cokolwiek technicznego wskazuje na brak zrozumienia-może przestrzeganie cudzych wytycznych, w książce lub artykule....

Nie ma nic złego w pojedynczym unikalnym ID-fakcie, jeśli masz aplikację podłączoną do serwera bazy danych i możesz wybrać, której bazy danych używasz to wszystko będzie dobre, i możesz prawie zrobić wszystko z kluczami i naprawdę nie cierpieć zbyt źle.

Było i będzie dużo o tym napisano, bo nie ma jednej odpowiedzi. Istnieją metody i podejścia, które należy stosować ostrożnie w sposób wykwalifikowany.

Miałem wiele problemów z tym, że ID jest dostarczane automatycznie przez bazę danych - I unikaj ich tam, gdzie to możliwe, ale nadal używaj ich od czasu do czasu.

 2
Author: Richard Harrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 19:22:09

... jak baza danych radzi sobie z polami ID w nieefektywny sposób i kiedy buduje indeksy, sortowanie drzew jest wadliwe ...

Było to prawie na pewno nonsensem, ale mogło mieć związek z kwestią kwestionowania bloków indeksu podczas przypisywania liczb rosnących do PK z dużą szybkością z różnych sesji. Jeśli tak, to indeks odwróconego klucza jest tam, aby pomóc, aczkolwiek kosztem większego rozmiaru indeksu ze względu na zmianę algorytmu podziału bloków. http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/schema.htm#sthref998

Go syntetyczne, szczególnie jeśli pomaga szybszy rozwój z zestawem narzędzi.

 2
Author: David Aldridge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 20:09:46

Nie jestem doświadczonym, ale nadal jestem za używaniem klucza podstawowego, ponieważ id tutaj jest wyjaśnienie na przykładzie..

Format danych zewnętrznych może się zmieniać w czasie. Na przykład, można by pomyśleć, że ISBN książki będzie dobry klucz podstawowy w tabeli książek. W końcu ISBN są wyjątkowe. Ale ponieważ ta konkretna książka jest pisana, przemysł wydawniczy w Stanach Zjednoczonych przygotowuje się do poważnej zmiany, ponieważ dodatkowe cyfry są dodawane do wszystkich ISBN. Gdybyśmy używając ISBN jako klucza podstawowego w tabeli książek, musielibyśmy aktualizować każdy wiersz, aby odzwierciedlić tę zmianę. Ale wtedy mielibyśmy inny problem. W bazie danych będą znajdować się inne tabele, które odwołują się do wierszy w tabeli książki za pomocą klucza głównego. Nie możemy zmienić klucza w tabeli książek, chyba że najpierw przejrzymy i zaktualizujemy wszystkie te odniesienia. A to będzie wymagało zniesienia ograniczeń klucza obcego, aktualizacji tabel, aktualizacji tabeli książek i wreszcie przywrócenia ograniczeń. Wszystkie w sumie to jest coś w rodzaju bólu. Problemy znikną, jeśli użyjemy własnej wartości wewnętrznej jako klucza podstawowego. Żadna osoba trzecia nie może przyjść i arbitralnie powiedzieć nam, aby zmienić nasz schemat-kontrolujemy własną przestrzeń kluczy. A jeśli coś takiego jak ISBN musi się zmienić, może się zmienić bez wpływu na jakiekolwiek istniejące relacje w bazie danych. W efekcie oddzieliliśmy łączenie wierszy od zewnętrznej reprezentacji danych w tych wierszach.

Chociaż Wyjaśnienie jest dość książkowe, ale myślę, że wyjaśnia rzeczy w prostszy sposób.

 2
Author: Mohit Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-21 07:06:47

@JeremyDWill

Dziękuję za zapewnienie bardzo potrzebnej równowagi w debacie. W szczególności, dzięki za informacje na DOMAIN s.

Właściwie używam kluczy zastępczych w całym systemie dla zachowania spójności, ale kompromisy. Najczęstszą przyczyną dla mnie przeklinać za pomocą kluczy zastępczych jest, gdy mam tabelę wyszukiwania z krótką listą wartości kanonicznych-użyłbym mniej miejsca i wszystkie moje zapytania byłyby krótsze / łatwiejsze / szybsze, gdybym tylko miał wartości PK zamiast dołączyć do stołu.

 1
Author: Hank Gay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 08:42:11

Możesz zrobić jedno i drugie - ponieważ każda duża baza danych firmy może być używana przez kilka aplikacji, w tym ludzkie bazy danych uruchamiające jednorazowe zapytania i import danych, projektowanie jej wyłącznie na rzecz systemów ORM nie zawsze jest praktyczne lub pożądane.

To, co obecnie robię, to dodawanie właściwości "RowID" do każdej tabeli - to pole jest identyfikatorem GUID i tak unikalnym dla każdego wiersza. Nie jest to klucz podstawowy - jest to klucz naturalny (jeśli to możliwe). Jednak wszelkie warstwy ORM działające na ta baza danych może używać RowID do identyfikacji ich pochodnych obiektów.

Więc możesz mieć:

CREATE TABLE dbo.Invoice (
  CustomerId varchar(10),
  CustomerOrderNo varchar(10),
  InvoiceAmount money not null,
  Comments nvarchar(4000),
  RowId uniqueidentifier not null default(newid()),

  primary key(CustomerId, CustomerOrderNo)
)

Więc twój DBA jest szczęśliwy, twój architekt ORM jest szczęśliwy, a integralność bazy danych jest zachowana!

 1
Author: Keith Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-24 15:03:11

Chciałem tylko dodać coś, czego nigdy nie widzę, omawiając automatycznie generowane pola tożsamości integer z relacyjnymi bazami danych (ponieważ widzę je często), a to znaczy, że jest to typ bazowy, który może w pewnym momencie przepełnić się.

Teraz nie próbuję powiedzieć, że to automatycznie sprawia, że composite ID jest drogą do zrobienia, ale faktem jest, że nawet jeśli więcej danych można logicznie dodać do tabeli( która jest nadal unikalna), pojedyncza automatycznie wygenerowana tożsamość całkowita może temu zapobiec.

Tak, zdaję sobie sprawę, że w większości sytuacji jest to mało prawdopodobne, a użycie 64-bitowej liczby całkowitej daje dużo miejsca na głowie, a realistycznie baza danych prawdopodobnie powinna być zaprojektowana inaczej, jeśli takie przepełnienie kiedykolwiek miało miejsce.

Ale to nikogo nie powstrzymuje... tabela wykorzystująca pojedynczą automatycznie wygenerowaną 32-bitową liczbę całkowitą jako tożsamość, która ma przechowywać wszystkie transakcje na poziomie globalnym dla danego fast-foodu firma, nie powiedzie się, gdy tylko spróbuje wstawić to 2,147,483,648 TH transakcja (i to jest całkowicie wykonalny scenariusz).

To jest po prostu coś do zauważenia, że ludzie mają tendencję do tuszowania lub po prostu ignorować całkowicie. Jeśli jakakolwiek tabela ma być wstawiana z regularnością, należy rozważyć, jak często i ile danych będzie gromadzić się w czasie, i czy identyfikator oparty na liczbie całkowitej powinien być nawet używany.

 0
Author: Xorcist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-08 15:52:05