2010-04-13 11 views
5

Czytałem ostatnio zagraniczne klucze i przyłączam się do nich i byłem mile zaskoczony, że wiele podstawowych pojęć to rzeczy, które już wprowadzam w życie. Na przykład, w jednym projekcie Obecnie pracuję, jestem organizowanie listy słów i mieć stolik dla zbiorów, tak jak poniżej:Wiele do wielu związków w MySQL

`words` Table 
    `word_id` 
    `headword` 
    `category_id` 
`categories` Table 
    `category_id` 
    `category_name` 

Teraz, ogólnie rzecz biorąc, byłoby to jedno-to- wiele relacji, z kilkoma słowami umieszczonymi pod jedną kategorią z kluczem obcym category_id. Załóżmy jednak na chwilę, że użytkownik zdecyduje się dodać inną kategorię do słowa, czyniąc ją wiele-do-wielu. Czy istnieje sposób na skonfigurowanie tabeli words do obsługi dodatkowych kategorii słów bez tworzenia dodatkowych kolumn, takich jak category_2 , category_3 itd.?

Odpowiedz

12

Zazwyczaj masz osobną tabelę do obsługi tych odwzorowań:

`Words_Categories` Table 
    `word_id` 
    `category_id` 

Każda para w tym Words_Categories tabeli reprezentuje jedną z możliwych odwzorowanie dowolnego słowa do innej kategorii.

Pole category_id w tabeli category_id staje się niepotrzebne w tym schemacie, ponieważ żadna z tych tabel nie odnosi się bezpośrednio do siebie.

+0

czy zawsze występuje w liczbie mnogiej dla tabeli łączenia wielu do wielu? Przynajmniej, czy to jest konwencja? – Thufir

4

Użytkownik usunie identyfikator category_id z tabeli słów i będzie miał tabelę zawierającą słowo word_id, category_id (zwykle unikalny indeks lub ograniczenie), która jest zwykle nazywana tabelą łączy lub tabelą mostów. Jest to typowa znormalizowana struktura relacji wielu do wielu.

Posiadanie wielu kolumn category_id w tabeli słów nie jest zalecane z wielu powodów, dlatego też zwykłe formularze eliminują "tablice" z przechowywania w wierszach.

+0

"zwykle nazywane tabelą łączy lub tabelą mostów", dziękuję za dodanie terminologii tutaj. –

6

NIE WOLNO tworzyć dodatkowych kolumn, takich jak category_2 i category_3. W ten sposób leży szaleństwo.

Zamiast tego usunąłbyś kolumnę "id_categorii" z tabeli "słowa". Następnie utworzysz nową tabelę "category_words" z kolumnami "category_id" i "word_id". Aby umieścić słowo w kategorii, wstaw rekord do tej tabeli. Aby umieścić to samo słowo w innej kategorii, wstaw inny rekord do tabeli.

+4

+1 za "W ten sposób leży szaleństwo!" ;) – FrustratedWithFormsDesigner