Por exemplo... tenho três tabelas e quero relacioná-las. Tenho a tabela usuário, produto e compra.
usuario
----------------
id
nome
sobrenome
login
----------------
produto
----------------
id
titulo
descricao
preco
----------------
compra
----------------
id
id_usuario
id_produto
valor
----------------
Defini login como PK de usuario, titulo+descricao como PK de produto. Agora em compra eu quero definir os dois ids como PK e FK e dá erro!
Eu consigo inserir na tabela sem ter nada na tabela produto ou usuario. Era pra dar erro de integridade de chaves.
A pergunta é tonta, mas: minha FK tem que ser PK da tabela referênciada?
Relacionamento
Started By beneti, 20/02/2008, 14:30
6 replies to this topic
#1
Posted 20/02/2008, 14:30
#2
Posted 21/02/2008, 14:16
Cara, muito esquisito...
Mas afinal, porque sua PK é titulo + descricao?
Como você pretende relacionar um campo numérico (id_produto) com dois campos string (titulo e descricao)? É isso que você está tentando fazer?
Suas PKs não deveriam ser por ID?
Mas afinal, porque sua PK é titulo + descricao?
Como você pretende relacionar um campo numérico (id_produto) com dois campos string (titulo e descricao)? É isso que você está tentando fazer?
Suas PKs não deveriam ser por ID?
#3
Posted 21/02/2008, 19:10
Não, cara.
Eu defini chave primária o título e a descrição, pois não quero que se repitam, que é a função da chave primária.
Titulo: Televisão 29"
Descrição: Marca Sony, tela plana
Se eu tentar inserir o mesmo registro, não vou conseguir. É o que eu quero. O ID é para relacionar com outras tabelas.
ex:
usuario
----------------
1
jose
silva
jsilva
----------------
produto
----------------
1
televisao 29"
sony, tela plana
1000
----------------
compra
----------------
1
1
1
2000
----------------
Quer dizer que o usuario da ID 1, comprou o produto da ID 1. Certo? Mas mesmo quando as tabelas usuario e produto estão vazias eu consigo inserir registros na tabela compra. Era para dar erro de integridade das chaves...
Eu defini chave primária o título e a descrição, pois não quero que se repitam, que é a função da chave primária.
Titulo: Televisão 29"
Descrição: Marca Sony, tela plana
Se eu tentar inserir o mesmo registro, não vou conseguir. É o que eu quero. O ID é para relacionar com outras tabelas.
ex:
usuario
----------------
1
jose
silva
jsilva
----------------
produto
----------------
1
televisao 29"
sony, tela plana
1000
----------------
compra
----------------
1
1
1
2000
----------------
Quer dizer que o usuario da ID 1, comprou o produto da ID 1. Certo? Mas mesmo quando as tabelas usuario e produto estão vazias eu consigo inserir registros na tabela compra. Era para dar erro de integridade das chaves...
#4
Posted 25/02/2008, 15:13
Não é bem assim.
Não permitir que valores se repitam é a função da Unique Key, não da Primary Key.
Se você usa ID, é muito melhor que use este como índice e os outros valores como UK.
Mas tudo bem! Respondendo sua pergunta... não, a FK não tem necessariamente que ser PK da tabela referenciada, mas ajuda bastante!
Eu ainda não entendi muito bem como está seu banco porque é uma modelagem um pouco fora do comum. Se você quiser postar o script de criação dessas tabelas, acho que entenderei e poderei te ajudar. Ok?
Não permitir que valores se repitam é a função da Unique Key, não da Primary Key.
Se você usa ID, é muito melhor que use este como índice e os outros valores como UK.
Mas tudo bem! Respondendo sua pergunta... não, a FK não tem necessariamente que ser PK da tabela referenciada, mas ajuda bastante!
Eu ainda não entendi muito bem como está seu banco porque é uma modelagem um pouco fora do comum. Se você quiser postar o script de criação dessas tabelas, acho que entenderei e poderei te ajudar. Ok?
#5
Posted 25/02/2008, 15:27
Sem dúvida é fora do comum, sim.
Geralmente, para cada tabela definimos a ID como chave primária... Eu estava experimentando um outro modo, já que eu posso usar o login como chave primária ou qualquer outro campo. Eu nunca defini um campo como UK. Por exemplo...
eu tenho o registro
------------------
1
jose
silva
jsilva
um usuario vem e tenta cadastrar...
joao
silva
jsilva
Como você barraria sem ter que ficar checando? Pois é um saco checar... É muito mais simples manipular o erro, quando você o prevê. Se eu defino o login como PK, dará erro, certo? Com a UK também? UK tem em todos os bancos ou só no MySQL? Digo isso, pois o auto_increment do mysql que é uma mão na roda, não tem no oracle (que você tem que ficar criando sequence e trigger).
Geralmente, para cada tabela definimos a ID como chave primária... Eu estava experimentando um outro modo, já que eu posso usar o login como chave primária ou qualquer outro campo. Eu nunca defini um campo como UK. Por exemplo...
eu tenho o registro
------------------
1
jose
silva
jsilva
um usuario vem e tenta cadastrar...
joao
silva
jsilva
Como você barraria sem ter que ficar checando? Pois é um saco checar... É muito mais simples manipular o erro, quando você o prevê. Se eu defino o login como PK, dará erro, certo? Com a UK também? UK tem em todos os bancos ou só no MySQL? Digo isso, pois o auto_increment do mysql que é uma mão na roda, não tem no oracle (que você tem que ficar criando sequence e trigger).
#6
Posted 25/02/2008, 15:54
Sim, se seu campo login está setado como UK e você tenta cadastrar um segundo registro com o mesmo login, vai dar erro de inttegridade abortando a transação. Igualzinho aconteceria com a PK, só que gerando índices com números pequenos ao invés de grandes textos (no caso de uma chave PK composta por nome do produto e descrição, por exemplo...).
Não sei se tem em "qualquer banco" porque o mercado tá cheio de SGBDs né? Mas não consigo lembrar de nenhum SGBD que não tenha Unique Key.
E quanto ao auto_increment, na verdade é o MySQL que está na contra-mão. Praticamente todo o resto dos SGBDs modernos usa SEQUENCEs.
Até concordo que é mais trabalhoso, mas é bem mais flexivel... e quando você acostumar a usar sequences, não fará muita diferença.
O PostgreSQL criou uma solução "preguiçosa" que eu costumo utilizar.
Você seta o campo com o tipo SERIAL.
Na verdade esse tipo não existe. O que o Postgres vai fazer é setar o campo como int e criar a sequence e todo o resto sozinho. Aí, se quiser customizar, fica mais fácil.
Infelizmente (Até onde eu sei) esse recurso não está disponível no Oracle, já que você o citou.
Blz?
Não sei se tem em "qualquer banco" porque o mercado tá cheio de SGBDs né? Mas não consigo lembrar de nenhum SGBD que não tenha Unique Key.
E quanto ao auto_increment, na verdade é o MySQL que está na contra-mão. Praticamente todo o resto dos SGBDs modernos usa SEQUENCEs.
Até concordo que é mais trabalhoso, mas é bem mais flexivel... e quando você acostumar a usar sequences, não fará muita diferença.
O PostgreSQL criou uma solução "preguiçosa" que eu costumo utilizar.
Você seta o campo com o tipo SERIAL.
Na verdade esse tipo não existe. O que o Postgres vai fazer é setar o campo como int e criar a sequence e todo o resto sozinho. Aí, se quiser customizar, fica mais fácil.
Infelizmente (Até onde eu sei) esse recurso não está disponível no Oracle, já que você o citou.
Blz?
#7
Posted 25/02/2008, 19:20
Interessante. Comecei a definir com UK, não sabia. Eu não tinha idéia dos índices que você citou... embora tenham vários SGBD, alguns são os mais usados e eu não sabia que o mysql estava na contra mão, nesse aspecto.
Mas isso aí.. valeu, cara!
Mas isso aí.. valeu, cara!
1 user(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)