Não existem chaves compostas em rails?
Em rails ou no active record?
Se for no ActiveRecord, não, ele não dá nenhum suporte especial a chaves compostas. Mas você pode usar esse plugin pra facilitar a sua vida -> http://compositekeys.rubyforge.org/
De qualquer forma, chaves compostas são uma péssima idéia
[quote=Maurício Linhares]Em rails ou no active record?
Se for no ActiveRecord, não, ele não dá nenhum suporte especial a chaves compostas. Mas você pode usar esse plugin pra facilitar a sua vida -> http://compositekeys.rubyforge.org/
De qualquer forma, chaves compostas são uma péssima idéia :)[/quote]
why ?
É, why?
Objetos se relacionam entre si através de associações. Na teoria existem vários tipos de associações n-árias e até classes de associação. O problema é que muitos desses conceitos não são implementáveis em código de maneira natural na maioria das linguagens.
No âmbito de negócio também era comum você usar chaves compostas para garantir integridade. Você fazia uma nota fiscal ter a chave (cod_nota + cod_filial) só para garantir essa integridade entre as tuplas. Na verdade o relacionamento é que a filial possui notas fiscais e uma nota é de uma filial e seu próprio modelo tem que garantir que as notas de uma filial não se misture com outras.
Quando você pensa num modelo de objetos, como as coisas acontecem na vida real, você não precisa de chaves compostas. As associações binárias são suficientes. Chave composta é um conceito do modelo relacional e não do modelo de objetos.
[quote=rodrigoy]
Quando você pensa num modelo de objetos, como as coisas acontecem na vida real, você não precisa de chaves compostas. As associações binárias são suficientes. Chave composta é um conceito do modelo relacional e não do modelo de objetos.[/quote]
Ok mas nada impede (exceto um ORM feijão-com-arroz como ActiveRecord) que você tenha uma base relacional e um sistema Orientado a Objetos, nete caso chaves compostas fazem sentido.
No geral eu concordo com você que é melhor evitar chaves compostas mas é bom separar o que é paradigma e o que é prática.
Sim… o cuidado que deve ser tomado é fazer seu modelo de objetos direcionar seu modelo relacional e não o contrário [Ambler]. Se isso for sua prática dificilmente existirá chaves compostas. Usamos a chave única (world-famous campo id) sem “business meaning”.
Já faz uns bons 4 anos que não modelo banco de dados e as vezes que precisei lidar com legado foi um porre. Hibernate por exemplo é muito green-field IMHO.
1 - E qual seria o jeito certo de fazer?
2 - Pensando bem, qualquer chave comporta pode ser substituída por um único campo de ID, certo?
Isso… A filial nada mais é que uma associação com a nota. Cada um tem seu único ID sem “business meaning”. Se uma nota não pode estar associada a 2 filiais seu sistema deve resolver isso funcionalmente. Se quiser bloquear isso no banco crie um índice unique.
Acho que foi isso que eu me confundi, pois eu queria pôr uma restrição dessas num banco aqui, onde 2 campos não poderão ter o mesmo valor conjunto. Não é uma chave composta, mas sim um “unique composto”. Isso pode né?
Claro