Mam tabelę Producers
i tabelę Products
, z których oba mają postać:
Id
- int, klucz podstawowyName
- nvarchar
Producent może przenosić wiele Produktów, więc zamierzałem stworzyć tabelę o nazwie, ProducerDetails
która miałaby:
ProducerId
- int, klucz obcy doProducers.Id
ProductId
- int, klucz obcy doProducts.Id
Potem zacząłem zadawać sobie pytania, więc pomyślałem, że zapytam ekspertów. Czy lepszym rozwiązaniem byłoby zaprojektowanie dodatkowej Id
kolumny (int, klucz główny) w mojej ProducerDetails
tabeli? Czy to jest niepotrzebne?
Używam SQL-Server 2008 R2, jeśli w ogóle coś to robi.
EDYCJA - Relacje między tymi tabelami byłyby, moim zdaniem, wiele do wielu, przepraszam, że nie wyjaśniłem tego. Producent może przewozić wiele rodzajów produktów, a ten sam produkt może być wytwarzany przez wielu różnych producentów.
Przepraszam, jeśli to pytanie jest zbyt proste, integralność referencyjna / projektowanie bazy danych nie jest moją mocną stroną (chociaż staram się to poprawić).
źródło
id
pola w jego tabeli relacji ma jakąkolwiek wartość ?ProductId, ProducerId
jest to unikalna kombinacja, nie widzę potrzeby dodawania kolejnego sztucznego klucza do tabeli Join. Zgoda? I chyba chyba nie rozumiem pytania, OP nie musi nawet używać tabeli Join dla tego przypadku użycia.Nie, dodanie wartości dodatkowego klucza podstawowego do tej tabeli nie ma żadnej wartości. Wasze dołączenia będą się odnosić tylko
ProducerID
iProductID
dlatego jest to tylko ciężar własny. MOIM ZDANIEM.Chociaż zgadzam się z @Shark, że tabela łączenia nawet nie wydaje się tutaj potrzebna, chyba że robisz wszystko, aby nie zmieniać schematu istniejących tabel w jakikolwiek sposób.
Nawiasem mówiąc, uważam również, że warto nazwać swój główny identyfikator w całości (np.
Products.ProductID
ZamiastProducts.ID
), aby identyfikator był konsekwentnie nazywany w całym schemacie.źródło
ProductID
). Zaletą jest to, że kiedy zobaczysz anSometableID
, natychmiast wiesz, do której tabeli się odnosi. Innym jest to, że możesz użyćProduct JOIN ProducerDetail USING(ProductID)
składni zamiast dłuższejProduct JOIN ProducerDetail ON Product.ID = ProducerDetail.ProductID
USING(ProductID)
nie jest dostępny w SQL-Server, więc ten punkt nie ma zastosowania.