Eu tenho uma tabela de Producers
e uma tabela de Products
, ambas com a forma:
Id
- int, chave primáriaName
- nvarchar
Um produtor pode transportar vários produtos, então eu criaria uma tabela chamada ProducerDetails
que teria:
ProducerId
- int, chave estrangeira paraProducers.Id
ProductId
- int, chave estrangeira paraProducts.Id
Então comecei a me questionar, então pensei em perguntar aos especialistas. Seria melhor design de banco de dados ter uma Id
coluna adicional (int, chave primária) na minha ProducerDetails
tabela? Ou isso é desnecessário?
Estou usando o SQL-Server 2008 R2, se isso fizer alguma diferença.
EDIT - O relacionamento entre essas tabelas seria muitos para muitos, creio, desculpe por não ter deixado isso claro. Um produtor pode transportar vários tipos de produtos e o mesmo produto pode ser produzido por vários produtores diferentes.
Peço desculpas se essa pergunta é muito simples, a integridade referencial / o design do banco de dados não é o meu ponto forte (embora eu esteja tentando melhorar isso).
fonte
id
campo em sua tabela de relações?ProductId, ProducerId
for uma combinação única, não vejo a necessidade de adicionar outra chave artificial à tabela Join. Acordado? E acho que, a menos que esteja entendendo mal a pergunta, o OP nem precisa usar uma tabela Join para esse caso de uso.Não, não há valor em adicionar uma "chave primária" adicional a esta tabela. Suas junções sempre se referem a
ProducerID
eProductID
, portanto, é apenas peso morto. NA MINHA HUMILDE OPINIÃO.Embora eu concorde com o @Shark que a tabela de junção nem parece ser necessária aqui, a menos que você esteja se esforçando para não alterar o esquema das tabelas existentes de forma alguma.
Como um aparte, também acho que vale a pena nomear seu identificador principal por completo (por exemplo, em
Products.ProductID
vez deProducts.ID
) para que o identificador seja denominado de forma consistente em todo o esquema.fonte
ProductID
). Uma vantagem é que, quando você vê umSometableID
, sabe imediatamente a qual tabela se refere. Outra é que você pode usar aProduct JOIN ProducerDetail USING(ProductID)
sintaxe, em vez do maisProduct JOIN ProducerDetail ON Product.ID = ProducerDetail.ProductID
USING(ProductID)
não está disponível no SQL-Server, portanto esse ponto não se aplica.