O momento mais sensato para usar isso seria se houvesse dois conceitos separados que só se relacionariam dessa maneira. Por exemplo, um carro pode ter apenas um motorista atual, e o motorista só pode dirigir um carro por vez - então a relação entre os conceitos de carro e motorista seria de 1 a 1. Aceito que este é um exemplo inventado para demonstrar o ponto.
Outra razão é que você deseja especializar um conceito de maneiras diferentes. Se você tem uma tabela Person e deseja adicionar o conceito de diferentes tipos de Person, como Employee, Customer, Shareholder - cada um deles precisaria de conjuntos diferentes de dados. Os dados semelhantes entre eles estariam na tabela Pessoa, as informações do especialista estariam nas tabelas específicas para Cliente, Acionista, Funcionário.
Alguns mecanismos de banco de dados lutam para adicionar com eficiência uma nova coluna a uma tabela muito grande (muitas linhas) e tenho visto tabelas de extensão usadas para conter a nova coluna, em vez de a nova coluna ser adicionada à tabela original. Este é um dos usos mais suspeitos de tabelas adicionais.
Você também pode decidir dividir os dados para um único conceito entre duas tabelas diferentes para problemas de desempenho ou legibilidade, mas este é um caso razoavelmente especial se você estiver começando do zero - esses problemas aparecerão mais tarde.
Primeiro, acho que é uma questão de modelar e definir o que consiste em uma entidade separada. Suponha que você tenha
customers
um e apenas um únicoaddress
. Claro que você poderia implementar tudo em uma única tabelacustomer
, mas se, no futuro, permitir que ele tenha 2 ou mais endereços, você precisará refatorar isso (não é um problema, mas tome uma decisão consciente).Também posso pensar em um caso interessante não mencionado em outras respostas em que dividir a tabela pode ser útil:
Imagine, novamente, você tem
customers
com um únicoaddress
cada, mas desta vez é opcional ter um endereço. Claro que você pode implementar isso como um monte deNULL
colunas -able, comoZIP,state,street
. Mas suponha que, dado que você tem um endereço, o estado não é opcional, mas o ZIP é. Como modelar isso em uma única tabela? Você poderia usar uma restrição nacustomer
tabela, mas é muito mais fácil dividir em outra tabela e tornar a Foreign_key NULLable. Dessa forma, seu modelo é muito mais explícito ao dizer que a entidadeaddress
é opcional e queZIP
é um atributo opcional dessa entidade.fonte
No meu tempo de programação, encontrei isso apenas em uma situação. Que é quando há um relacionamento de 1 para muitos e 1 para 1 entre as mesmas 2 entidades ("Entidade A" e "Entidade B").
Quando "Entidade A" tem várias "Entidades B" e "Entidade B" tem apenas 1 "Entidade A" e "Entidade A" tem apenas 1 "Entidade B" atual e "Entidade B" tem apenas 1 "Entidade A".
Por exemplo, um carro pode ter apenas um motorista atual, e o motorista só pode dirigir um carro por vez - então a relação entre os conceitos de carro e motorista seria de 1 para 1. - Eu peguei emprestado este exemplo da resposta de @Steve Fenton
Onde um motorista pode dirigir vários carros, mas não ao mesmo tempo. Portanto, as entidades Car e Driver são 1 para muitos ou muitos para muitos. Mas se precisamos saber quem é o driver atual, então também precisamos da relação 1 para 1.
fonte
Outro caso de uso pode ser se o número máximo de colunas na tabela do banco de dados for excedido. Então você pode entrar em outra mesa usando OneToOne
fonte