Pela primeira vez, me encontro totalmente perdido em termos de encontrar um bom título de pergunta.
Considere as três tabelas a seguir. Cada um tem colunas adicionais, mas apenas as colunas relevantes para os relacionamentos entre as tabelas são mencionadas:
- A tabela
a
tem uma chave primáriaa_id
- A tabela
b
tem uma chave primáriab_id
e uma colunaa_id
que é uma chave estrangeira paraa
(relação um-para-muitos) - A tabela
reference
tem uma chave primáriaref_id
reference
é uma lista de fontes que são citadas para substanciar as informações contidas nas outras 2 tabelas. Como tal, preciso de tabelas para relacioná-los. Ambos a
e b
têm relacionamentos muitos-para-muitos com reference
, mas há uma complicação adicional: um número de nota de rodapé. Este número de nota de rodapé deve ser único para cada par a
e reference
, mas só é necessário quando existe uma relação entre a b
e o mesmo reference
. (Claro, isso b
deve estar relacionado ao mesmo a
.) A melhor maneira que encontrei para representar esse relacionamento até agora é um par de tabelas:
bridge_a_reference
:
- Colunas:
a_id
,ref_id
,footnote_num
(anulável) - Chave primária:
a_id
,ref_id
- Chaves estrangeiras:
a_id
para tabelaa
;ref_id
para mesareference
bridge_b_reference
:
- Colunas:
b_id
,a_id
,ref_id
- Chave primária:
b_id
,ref_id
- Chaves estrangeiras:
b_id
,a_id
para tabelab
;a_id
,ref_id
à mesabridge_a_reference
Isso garante a consistência dos dados. Só pode haver uma relação entre b
e reference
se uma relação correspondente entre a
e reference
existir e b
estiver relacionada com o correto a
. Também garante que o número da nota de rodapé seja consistente para todos os pares a
/ . reference
No entanto, é redundante, armazenando a relação entre a
e b
uma segunda vez (embora imposta para ser consistente, pelo menos) e não garante que o número da nota de rodapé seja necessário para as relações b
/ reference
.
Eu tentei reorganizar as tabelas na minha cabeça algumas vezes, mas tudo o mais que eu posso criar permite algum tipo de inconsistência ( b
para relacionamentos sem o reference
correspondente ou a
para números de notas de rodapé inconsistentes para os pares / ). estruturar minhas tabelas de ponte para eliminar a redundância e garantir os requisitos de nota de rodapé? É mesmo possível?reference
b
a
a
reference
Aqui está uma sugestão para que você possa impor as restrições que deseja declarativamente. (Simplifiquei um pouco os nomes das tabelas, removi o
bridge_
prefixo.)Nós removemos
footnote_num
de:Adicionamos esta tabela - que basicamente armazenará apenas as linhas
a_ref
com nota de rodapé, aquelas que você deseja adicionar filhos aob_ref
:E, finalmente, a 3ª tabela permanece como no seu design, exceto as chaves estrangeiras que agora fazem referência à tabela intermediária (
a_ref_with_footnote
):