Estou usando o MySQL5.5 e para esta pergunta tenho 3 tabelas simples t1, t2 e t3 projetadas assim:
+------------+ +------------+ +------------+
| t1 | | t2 | | t3 |
+------------+ +------------+ +------------+
| t1_id (PK) | | t2_id (PK) | | t3_id (PK) |
+------------+ | some_value | | t1_id (FK) |
+------------+ | t2_id (FK) |
+------------+
PK = chave primária, FK = chave estrangeira e todos os campos são do tipo INT
O problema que tenho é que quero adicionar uma restrição à tabela t3 que envolve o campo t2.some_value
. Basicamente, eu quero que a combinação de t1.t1_id
e t2.some_value
seja única na tabela t3. Por exemplo, aqui está uma situação que quero evitar:
t1 t2 t3
+-------+ +-------+------------+ +-------+-------+-------+
| t1_id | | t2_id | some_value | | t3_id | t1_id | t2_id |
+-------+ +-------+------------+ +-------+-------+-------+
| 10 | | 20 | 1 | | 30 | 10 | 20 | <-- t2.some_value = 1
| 11 | | 21 | 2 | | 31 | 10 | 21 |
+-------+ | 22 | 3 | | 32 | 10 | 22 |
| 23 | 1 | | 33 | 10 | 23 | <-- t2.some_value = 1
+-------+------------+ | 34 | 11 | 23 |
+-------+-------+-------+
O problema aqui é que dois registros em t3 vinculam o mesmo registro t1 (t1_id=10) a dois registros t2 diferentes que têm o mesmo arquivo some_value
. Existe alguma maneira de evitar que isso aconteça? Que eu saiba, o MySql não permite a definição de restrições que abrangem várias tabelas.
Posso pensar em uma solução, mas isso envolve duplicar o some_value
campo na tabela t3 para que eu possa aplicar uma chave exclusiva diretamente a ele. Isso obviamente quebra a regra de design de normalização, mas existe outra maneira?
Pelo que posso dizer, você terá que criar o 'some_value' na tabela3. Aqui está um link para a página de manual sobre restrições de chave estrangeira
Há um exemplo com uma restrição de chave estrangeira 'complexa' que é semelhante à sua configuração, que duplica o conteúdo da terceira tabela. Há um conforto (mínimo) em saber que, pelo menos, é tratado por uma chave estrangeira.