2010-06-21 13 views
11

Zgaduję, że nie, ponieważ klucze obce są kluczami podstawowymi w ich własnych tabelach, więc będą unikatowe.Czy tabela bazy danych, która zawiera dwie kolumny będące kluczami obcymi, ma trzecią kolumnę, która jest kluczem podstawowym?

Więcej informacji

używam MySQL i trzy następujące tabele są przy użyciu silnika InnoDB.

======================= ======================= 
| galleries   | | images    | 
|---------------------| |---------------------| 
| PK | gallery_id  | | PK | image_id  | 
| | name   | | | title   | 
| | description | | | description | 
| | max_images  | | | filename  | 
| | enabled  | | | enabled  | 
======================= ======================= 

======================== 
| galleries_images  | 
|----------------------| 
| FK | gallery_id  | 
| FK | image_id  | <----- Should I add a PK to this table? 
======================== 

Epilog

Dzięki za doskonałe odpowiedzi. Dowiedziałem się o kluczach złożonych i, po rozważeniu mojego konkretnego przypadku, zdecydowałem się uczynić kolumnę image_id w tabeli galleries_images kluczem podstawowym. W ten sposób obrazy mogą być powiązane tylko z jedną galerią, której właśnie chcę.

Mam zamiar również wdrożyć kolumnę order_num w galleries_images, której użyję do utrzymania logiki PHP. W ten sposób użytkownik może umieścić zdjęcia w określonej kolejności w każdej galerii. Skończyło się to:

============================ 
| galleries_images   | 
|--------------------------| 
| PK, FK | image_id  | 
| FK  | gallery_id  | 
|  | order_num  | 
============================ 

Jeszcze raz dziękuję!

Epilog II

Dzięki Ci, którzy wskazywali, że nawet nie trzeba tej tabeli. Na początku nie dostarczyłem pełnych informacji. W końcu upuściłem tabelę galleries_images i właśnie dodałem gallery_id jako klucz obcy do tabeli images. W każdym razie, nauczyłem się więcej, niż myślałem, i będę wdzięczny za pomoc.

+0

+1. Nawet ja tak myślę, ale potrzebowalibyśmy więcej szczegółów. Zwykle dowolny DB tworzy unikalny indeks na kluczu podstawowym tabeli. Jeśli twoja tabela ma tylko te dwa klucze obce i nie ma klucza podstawowego, obawiam się, że indeks nie zostanie utworzony (niezatwierdzony, spekulujący). To zależy od tego, w jaki sposób i w jaki sposób tabela jest używana. – Guru

+0

Tylko dlatego, że klucze obce są odwzorowywane na klucze podstawowe w tabelach nadrzędnych, nie oznacza to, że kombinacja kluczy obcych musi być unikalna. – David

+3

CZEKAJ! jedyną potrzebą tablicy odwzorowania jest, jeśli model wymaga wielu do wielu relacji między galerią a obrazem. Jeśli tworzysz PK Image_ID, to już nie wiele-wiele ... po prostu umieść Gallery_ID w twojej Tabeli obrazów i skończ z tym. Nie wiem, czym jest InnoDB, ale jeśli tworzy śmieci tak, jak jedna z dwóch rzeczy jest prawdziwa, nie może odróżnić wielu-wielu od jednego-wielu, albo nie. Jest to problem z uruchomieniem bazy danych z fizycznego projektu. Nie zastanawiasz się, jakie są twoje relacje. –

Odpowiedz

6

Wszystkie tabele powinny mieć klucz podstawowy.

Nie jest konieczne utworzenie nowej kolumny zastępczej, która będzie działać jako klucz podstawowy. Biorąc pod uwagę przykład Johna, byłoby całkowicie do przyjęcia posiadanie złożonego klucza podstawowego z 2 kluczami klucza podstawowego z innych tabel i polem daty.

Z pragmatycznego punktu widzenia, chociaż czasami tworzenie nowej kolumny zastępczej może być łatwiejsze w pracy niż w przypadku złożonego, chociaż sam PK jest wymieniony w jeszcze innej tabeli lub w przypadku wiązania z różnymi kontrolkami, które nie obsługują kompozytu klucz podstawowy.

Edit

Po aktualizacji na swoje pytanie chciałbym po prostu zrobić klucz podstawowy kompozyt na gallery_id, image_id. Nie widzę żadnej korzyści z dodania nowej kolumny.

+2

Chociaż nie mam dowodów do przekazania, wyobrażam sobie, że użycie zastępczego odpowiednika liczby całkowitej jest szybsze do celów łączenia, a następnie użycia klucza złożonego. Z tego powodu zawsze tworzę zastępcze klucze na wszystkich stołach. – David

+0

@ David - To prawdopodobnie jest. Kolejna rzecz do dodania do równowagi! –

+0

O, klucz złożony to dla mnie coś nowego. Nie rozważałem tego jako opcji. –

5

Odpowiedź jest zwykle "tak". Tabela, którą opisujesz, jest tabelą skojarzeń , która przechowuje skojarzenia. Ponieważ te zapisy są interesujące same w sobie, a prawdopodobnie będziesz chciał je później sprawdzić, powinny mieć znaczącą tożsamość.

Na przykład być może masz stół players i stół matchups dla swojej ligi tenisowej. matchups może zawierać tylko klucze obce dwóch graczy, którzy grali przeciwko sobie; jest to stowarzyszenie między dwoma graczami.

Później możesz chcieć zapisać inne informacje specyficzne dla tego skojarzenia: czas meczu, wynik gry, i tak dalej. I, oczywiście, gdy tylko chcesz mieć więcej niż jeden pojedynek pomiędzy tymi samymi dwoma graczami, musisz rozróżnić poszczególne pojedynki. W ten sposób będziesz chciał nadać każdej matchup własną tożsamość w postaci klucza podstawowego.


Aktualizacja:

======================== 
| galleries_images  | 
|----------------------| 
| FK | gallery_id  | 
| FK | image_id  | <----- Should I add a PK to this table? 
======================== 

W Twoim konkretnym przykładzie, to chyba warto mieć klucz podstawowy tutaj. Jak tylko chcesz nagrać jakiekolwiek metadane dotyczące powiązania, będziesz chciał mieć ten klucz podstawowy.Ponadto, jeśli ten sam obraz może zostać dodany do tej samej galerii więcej niż raz, klucz podstawowy będzie potrzebny do rozróżnienia tych dwóch rekordów.

+0

Ponadto, w twoim przykładzie, pojedynek pomiędzy dwoma graczami może wystąpić więcej niż jeden raz, więc po prostu posiadanie identyfikatorów dwóch graczy jako klucza też nie zadziała. –

+0

@Eric: Zdecydowanie! Zmontowałem go, aby uderzyć w ten dom. –

+0

byłoby całkowicie dopuszczalne, aby mieć złożony klucz podstawowy z 2 polami klucza głównego z innych tabel i polem daty. –

1

Mówisz, że klucze obce są kluczami podstawowymi w ich własnych tabelach. Oznacza to, że są one unikalne w tych tabelach. Nie oznacza to jednak, że są one unikalne w tej tabeli.

Ogólnie stwierdziłem, że najlepiej jest utworzyć klucz podstawowy w tabeli bazy danych. Wcześniej czy później odkryjesz, że go potrzebujesz, więc dlaczego nie włączyć nowego klucza podstawowego od samego początku?

10

Teoretycznie, jeśli kombinacja dwóch kluczy obcych (FK) jest unikatowa w tabeli, lub jeśli kombinacja dwóch FK plus pewna inna kolumna jest unikalna, to tabela ma złożony klucz podstawowy i jest brak ścisłej potrzeby wprowadzenia innego klucza jako zastępczego klucza podstawowego. Jednak nie jest niczym niezwykłym, że ludzie dodają dodatkowy klucz. Częściowo zależy to od tego, za co jeszcze będą dane z tabeli ze złożonym kluczem podstawowym. Jeśli opisuje coś, co samo będzie miało wiersze z innych tabel z nim związanych, to może być sens wprowadzenie prostego PK.

Niektóre programy wydają się wymagać prostych kodów PK, nawet jeśli model danych relacyjnych nie.

2

Jeśli jedno konkretne zdjęcie może być powiązane tylko z jedną galerią, to kombinacje w tabeli zdjęć są unikatowe i można użyć tej pary pól jako PK.
Jeśli galerie-Images kombinacje mogą być powielane LUB
jeśli schemat zawiera więcej tabel, które są goind być Childs tej galerii-images,
to proponuję zrobić to dodatkowe pole, które będzie PK.

2

Ta odpowiedź ma związek z pytaniem blokującym: Wiem, powinien być nowy temat, ale cokolwiek. Proszę nie po prostu głosujcie za tym.

Na przykład można utworzyć tabelę Order_image_lock (identyfikator galerii (klucz podstawowy), czas_początkowy). Wygeneruj 3 metody/sprocs: GetLock, CheckLock, DropLock.

Jeśli chcesz zmienić kolejność portfela, zadzwoń GetLock, który wstawia (gallary_id, sysdate).

Jeśli to zadziała, możesz kontynuować. Jeśli nie powiedzie się w PK, ktoś inny zmienia kolejność, podnieść wyjątek.

Gdy będziesz gotowy na zmianę kolejności, zadzwoń na CheckLock, aby sprawdzić, czy Twój zamek nadal tam jest (zobaczysz, dlaczego), jeśli masz go, zaktualizuj zmienione wartości, a jeśli nie, przejdź do GetLock.

Po zakończeniu DropLock Usuwa rekord.

Proces serwera może zamiatać tabelę dla blokad starszych niż x minut. Dla rozłączników lub osób, które opuszczają ekran i idą na lunch.

Dodaj kolumnę user_id do tej tabeli, dzięki czemu możesz zgłosić kto ma blokady, które może chcieć inny użytkownik.

To będzie skalować znacznie lepiej niż faktycznie blokowanie wierszy. niektóre dbms mają skończoną liczbę blokad, co zmusza je do wykonania "blokady eskalacji", gdy zamki wielu wierszy są konwertowane na blokadę strony, dopóki nie ma zbyt wielu blokad stron i są zamieniane na blokadę tabeli ... musisz sprawdzić, jak Twoje RDBM działa z dużymi woluminami blokady ... jeśli planujesz skalować.

+0

Dziękuję bardzo! Wrócę do tego wkrótce. –

Powiązane problemy