Estou criando um DB no Oracle e me deparei com a seguinte situação: tenho uma tabela1 onde existe um número único que identifica os dados dessa tabela, isso o torna como sendo a primary key e existe outra tabela2 em que esse valor seria referenciado a tabela1, isso torna esse valor uma foreign key, até ai tudo bem.
Porém na tabela 2 nem todos esses valores vão referenciar a tabela 1, o que impede a criação do vinculo pk-fk, seria uma boa prática utilizar um valor que está referenciando outra tabela sem que essa seja ligada por uma fk?
Existe uma forma de se criar a ligação mesmo que nem todos os valores fossem uma fk?
Não vejo motivo para fazer isso Rodrigo, para entendermos melhor poste o DER do seu banco ou mesmo a QUERY que usou para monta-lo.
Repare nesta imagem abaixo, as fk estão em vermelho e as pk estão em amarelo, a “ligação” feita entre a tabela cliente e locação é o necessário para dizer que em um banco relacional minha locação pode conter 1 ou mais clientes, Porque minha tabela locacao possui uma fk “cliente”.
No exemplo da imagem, a minha situação se aplicaria da seguinte forma:
Eu tenho uma tabela categoria com o cod_categoria que é o pk, e um filme que irá ter uma fk de categoria, só que em um momento o filme irá ter uma categoria que NÃO irá estar listado na tabela categoria.
Entendeu?
Dessa forma eu não posso amarrar as duas tabelas com pk-fk, mesmo que se tenha essa relação para alguns valores.
Ainda não entendi muito bem, consegue nos passar todos os atributos dessas duas tabelas completas?
Talvez esteja querendo dizer que na tabela filme haverá uma categoria que não pertencerá a tabela categoria? se for isso… está montando sua estrutura errada, mas se virmos a tabela dará para dizer ao certo.
Quando não se há um vínculo “forte” entre as tabelas, forçando haver registros em ambas para o relacionamento existir, costuma-se criar uma “entidade fraca” (caramba ainda lembro desse termo )
No seu caso poderia criar uma terceira tabela sem id próprio (ou apenas para identificação nela mesma), vinculando os registros das demais…
categoria
id_categoria
filme
id_filme
categoria_filme
id_categoria
id_filme
Dessa forma você consegue representar um relacionamento de muitos para muitos sem afetar as outras duas, a desvantagem está no JOIN pois existe uma tabela a mais para vincular exemplo:
SELECT a.nome_categoria, c.nome_filme
FROM categoria AS a
INNER JOIN categoria_filme AS b ON a.id_categoria = b.id_categoria
INNER JOIN filme AS c ON c.id_filme = b.id_filme;
Dei uma pequisada e também lembrei disso, vou estudar se a criação de uma entidade fraca é realmente necessária e o quanto isso afetará no desempenho da consulta.