Eu tenho uma domains
tabela e cada domínio pertence a um arquivo contact
. Além disso, você pode atribuir 3 extras contacts
com diferentes funções admin , tech e billing , essas não são obrigatórias .
Meu primeiro pensamento foi adicionar três campos extras na minha tabela de domínios .
mas aí achei melhor criar uma tabela de interseção.
Alguma sugestão?
O uso de uma tabela de interseção é um design mais limpo e flexível.
Com colunas extras, você está limitado ao número de instâncias que pode incluir (uma por coluna de chave estrangeira). Além disso, os tipos de instâncias são limitados aos dados por suas colunas FK. Fazer qualquer alteração requer uma alteração no design da tabela. Além disso, como suas funções são opcionais, você pode ter muitos nulos em seus FKs. Ter colunas pouco preenchidas incomoda algumas pessoas. Se este é um problema real de design ou apenas um "cheiro de código" é discutível e depende de como você realmente preenche sua tabela.
Com uma tabela de interseção, você pode usar restrições para impor uma única instância por tipo ou pode permitir várias instâncias por tipo. Isso pode ser útil no futuro se você começar a ter contatos compartilhando uma função.
Além disso, com uma tabela de interseção, você pode criar uma nova função sem precisar alterar o design da tabela. Isso pode poupar muito trabalho no futuro.
Em ambas as abordagens, você vê que a tabela terá todas as colunas para reunir onde, para uma coluna, você sempre terá algum valor para cada linha e, para o restante, não sabe com que frequência a coluna terá valor, pois elas não são obrigatórias.
Nesses casos, eu separaria os dados por sua probabilidade de disponibilidade.
Table_1 = Domain_Owner --> DomainID, OwnerID
Table_2 = Domain_ExtraUser -->DominID,AdminID,TechID,BillingID
Table_3 = Contact --> ContactID
Agora, no design acima,
Table2
tem o mesmo problema. Como @JoelBrown mencionou quandoNULL
a capacidade não é determinística para a coluna, o desempenho das consultas contra eles será inesperado até que você faça alguns testes.Se não se espera que as tabelas sejam enormes, como em milhões de linhas, você pode transformá -las
Table_2
em um par chave-valor .TABLE_2 = Domain_ExtraUser --> DomainID ,ContactID