2012-07-20 16 views
6

Zamiast posiadania złożonego klucza podstawowego (ta tabela zachowuje relację między dwiema tabelami, która reprezentuje dwie jednostki [dwie tabele]), projekt ma mieć kolumnę identity jako klucz podstawowy a unikalne ograniczenie danych jest wymuszane na dwóch kolumnach, które reprezentują dane z klucza podstawowego jednostek.Zalety i wady posiadania złożonego klucza podstawowego ...

Dla mnie posiadanie kolumny tożsamości dla każdej tabeli relacji powoduje złamanie reguł normalizacji.

  • Jakie są standardy branżowe?
  • Co należy uwzględnić przed podjęciem decyzji projektowej?
  • Które podejście jest właściwe?

Dziękuję
Smith

+2

Prosty artykuł na temat profesjonalnych kluczy złożonych: http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx – RThomas

+0

nie ma potrzeby stosowania kolumny tożsamości, klucz podstawowy to w zasadzie zestaw kolumny (1 lub więcej), które jednoznacznie definiują twoje dane. Dodając kolumnę tożsamości, dodajesz dodatkowy indeks, a dzięki indeksowi najprawdopodobniej będziesz używał najwięcej (z dwoma ważnymi kolumnami) jako niezgrupowanego, a aktualizacje/wstawki będą wolniejsze, itd. Itd. Zasadniczo, nie ma potrzeby. – Rodolfo

+0

@RThomas - W tym blogu używają relacji Klienci-> Produkty, która nie powinna mieć klucza złożonego, ponieważ wskazuje dane transakcyjne. Tam * może * być wieloma relacjami utworzonymi w różnym czasie, ta tabela potrzebuje klucza unikatowej tożsamości. np. Zamawianie butelek wina pod tą samą SKU - do której odnosi się pojedynczy identyfikator produktu - (nie jest to idealne, ale możliwe). Ale jeśli każda butelka ma swój własny identyfikator, "limit zamówienia" jest dyskusyjny, ponieważ musisz utworzyć osobny rekord transakcji dla każdej pozycji. Albo źle zbudowałeś strukturę, albo śledzisz dane niepoprawnie. – hajikelist

Odpowiedz

5

Istnieje wiele tabel, gdzie może chcesz mieć kolumnę tożsamości jako klucz podstawowy. Jednak w przypadku tabeli relacji M: M, którą opisujesz, najlepszą praktyką NIE jest używanie nowej kolumny tożsamości dla klucza podstawowego.

Link do łącza RThomas w jego komentarzu stanowi doskonały powód, dla którego najlepszą praktyką jest NIE dodawanie kolumny tożsamości. Oto that link.

Minusy przeważają nad profesjonalistami praktycznie w każdym przypadku, ale ponieważ prosiłeś o plusy i minusy, włożyłem też kilka nieprawdopodobnych plusów.

Wady

  • zwiększa złożoność

  • może prowadzić do powielania relacje chyba wymusić na wyjątkowość relacji (której klucz podstawowy zrobi domyślnie).

  • Prawdopodobnie wolniej: db musi utrzymywać dwa indeksy zamiast jednego.

Plusy

Wszystkie plusy są dość pobieżne

  • Jeśli miał sytuację, w której trzeba było użyć klucza podstawowego tabeli związku w postaci przyłączenia do oddzielna tabela (np. tabela audytu?) połączenie będzie prawdopodobnie szybsze. (Jak już wspomniano - dodawanie i usuwanie rekordów będzie prawdopodobnie wolniejsze.) Ponadto, jeśli twoja tabela relacji jest relacją między tabelami, które same używają unikalnych identyfikatorów, wzrost prędkości od użycia jednej kolumny tożsamości w łączeniu względem dwóch będzie minimalny.)

  • Aplikacja, dla uproszczenia, może przyjąć, że każda tabela, z którą działa, ma unikalny identyfikator jako klucz podstawowy. (To kiepski projekt w aplikacji, ale możesz nie mieć nad nim kontroli.) Można sobie wyobrazić scenariusz, w którym lepiej wprowadzić jakąś dodatkową złożoność w DB, niż dodatkową złożoność w takiej aplikacji.

+0

Odpowiedzią jest użycie obu - zawsze mieć tożsamość, która jest unikalna na każdej tabeli [to ma więcej niż czysto wydajnościowe korzyści/szkody - programiści muszą pracować z tymi strukturami i ważne jest, aby mieć * spójną metodologię do interakcji z danymi *], ale używaj kluczy kompozytowych tam, gdzie ma to sens! A przede wszystkim bądź konsekwentny w swojej architekturze bazy danych. – hajikelist

2

Wady:

  • kompozytowe klucze podstawowe mają być przywiezione we wszystkich tabelach odwołującego. Oznacza to większe indeksy i więcej kodu do zapisu (np. Łączenia, aktualizacje). Jeśli systematycznie używasz kluczy złożonych podstawowych , może to stać się bardzo kłopotliwe.
  • Nie można zaktualizować części klucza podstawowego. Na przykład. jeśli używasz id_uniwersytetu, identyfikator_ ucznia jako klucz podstawowy w tabeli studentów uniwersytetu studentów i jeden uczeń zmienia uniwersytet, musisz usunąć i odtworzyć rekord.

Plusy:

  • kompozytowe klucze podstawowe pozwalają egzekwować wspólny rodzaj przymusu w potężny i Seemless sposób. Załóżmy, że masz stół UNIVERSITY, , stół STUDENT, stół kursowy i stół STUDENT_COURSE (który student uczeń śledzi który kurs). Jeśli jest to ograniczenie, które zawsze musisz być musi być studentem uniwersytetu A, aby śledzić kurs na uniwersytetu A, to ograniczenie zostanie automatycznie zatwierdzone, jeśli id_uniwersytetu jest częścią kluczy złożonych obu STUDENT i KIERUNEK.
2

Musisz utworzyć wszystkie kolumny w każdej tabeli, gdziekolwiek jest używany jako klucz obcy. To jest największa wada.

Powiązane problemy