2010-07-20 18 views
13

Jeśli mam relację między dwiema tabelami (obie tabele mają własne klucze podstawowe), co powinno kierować moją decyzją, która tabela powinna przechowywać klucz obcy? Rozumiem, że charakter relacji prawdopodobnie ma znaczenie (jeden do jednego, jeden do wielu, wiele do wielu, jednokierunkowy, dwukierunkowy), a prawdopodobnie także wzorce dostępu mają znaczenie. Jaki jest jednak systematyczny sposób podejmowania tej decyzji?Gdzie powinienem przechowywać klucz obcy?

+2

"Jaki jest systematyczny sposób podejmowania tej decyzji?" "rozumiem, że charakter relacji prawdopodobnie ma znaczenie". Poprawny. Charakter związku ma znaczenie. Nie mam pytania. Czy chcesz wiedzieć, jak zdefiniować, który jest zależny od drugiego? –

+0

[Dokumentacja MySQL kluczy zagranicznych] (https://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html#idm139680617903472) zapewnia prosty przykład relacji między 2 rodzicami tabele: 'customer',' product' i jeden podrzędny: 'product_order'. W tym przykładzie 'product_order' jest tabelą podrzędną, która powinna zawierać klucze obce. –

Odpowiedz

18

Który stół jest dzieckiem w związku?
Odpowiedz, i wiesz, która tabela potrzebuje kolumny klucza obcego, odwołując się do [zazwyczaj] klucza podstawowego rodzica. To dla relacji jeden-do-wielu ...

Wiele-do-wielu wymagałoby dodania trzeciej tabeli, używając kluczy z obu tabel jako klucza podstawowego.

+3

... i jeśli nie ma relacji dziecko/rodzic. to prawdopodobnie wiele-do-wielu w tabeli sprzężeń. – Wrikken

+5

Albo to relacja jeden-do-jednego, a OP powinien zadawać sobie pytanie, dlaczego jest podzielony na dwie tabele. – Allan

+1

@Wrikken, @Allan: Doskonałe punkty, oboje. –

1

Klucz obcy to po prostu pole w jednej tabeli, które odnosi się do pola klucza innej tabeli. Nie jest absolutnie konieczne, aby zidentyfikować pole klucza obcego jako takie. Oznacza to, że nie trzeba jawnie dodawać ograniczenia FOREIGN KEY ... REFERENCES do tabeli, aby był to klucz obcy. Po połączeniu obu tabel klucz podstawowy tabeli nadrzędnej będzie ustawiony jako klucz obcy tabeli podrzędnej. Niezależnie od tego, który jest nie kluczem podstawowym jest klucz obcy.

W relacjach jeden do wielu, FK przechodzi na "wiele". Nie może przejść na stronę "one", ponieważ tam się znajduje PK, a definicja klucza podstawowego obejmuje niedozwolone duplikaty.

Jeśli masz relację wiele do wielu, musisz przerobić tabele, aby uzyskać dwie relacje jeden-do-wielu i tabelę o średniej rozdzielczości.

7

"Co to jest systematyczny sposób podejmowania tej decyzji?"

Wygląda na to, że są dwie opcje: Strona "Jeden" jako FK do strony "Wiele stron" lub "Wiele" ma FK do strony "Jeden".

Spójrzmy na wybór.

  • Wszystkie wiersze strony "Wiele" mogą łatwo odwoływać się do jednego wiersza po stronie "Jeden".

  • Jeden rząd po stronie "Jeden" nie może nigdy odnosić się do WSZYSTKICH rzędów po stronie "Wiele".

Działa tylko jedna technika: strona "Wiele" ma stronę FK do strony "Jeden".

Istnieje tylko jeden faktyczny wybór wdrożenia. Nie ma "decyzji".

+3

W skrócie: to kwestia liczności. Jeśli masz relację wiele do jednego, klucz powinien znajdować się po stronie "wielu". Jeśli jest jeden do jednego, jeden po drugim. Jeśli jest to wiele-do-wielu, potrzebujesz tabeli pośredniej. Jeśli jest to jeden-do-jednego, możesz wybrać. – reinierpost

0

Podobnie jak primary key, foreign key jest również typem constraint umieszczonym na jednej lub kilku kolumnach w tabeli.

foreign key ustanawia połączenie między kolumnami kluczowymi i powiązanymi kolumnami w innej tabeli. (Można także połączyć kolumny klucza obcego z kolumnami w tej samej tabeli).

Tabela zawierająca klucz obcy jest uważana za tabelę podrzędną, a tabela, do której odwołuje się klucz obcy, jest tabelą nadrzędną.

Kluczowe punkty

  1. foreign key musi odwoływać klucz podstawowy lub ograniczenie przez unikalność, chociaż odniesienia może być na tym samym stole lub na innym stole
  2. foreign key musi mieć taki sam liczba kolumn jako liczba kolumn w ograniczeniu referencyjnym, a typy danych muszą pasować do odpowiednich kolumn.
  3. W przeciwieństwie do kolumn Primary key, Foreign key może zawierać wartości NULL.