Alguma vez faz sentido NÃO condensar relacionamentos individuais?


12

Se temos a Tabela A que tem um relacionamento individual com a Tabela B, faz algum sentido mantê-los separados? Ou nunca é demais combiná-los em uma única mesa? Algum desses cenários (duas tabelas versus uma tabela combinada) afeta alguma coisa em relação à sua forma normal (1NF, 2NF, 3NF, etc)?


5
Você quer dizer 1 para 1 ou 1 para 0 ou 1?
precisa saber é

Respostas:


30

Sim, existem várias razões pelas quais esse pode ser o melhor design.

Você pode ter um relacionamento de herança / extensão, por exemplo, você pode ter uma Usertabela e, em seguida, uma Administratortabela com mais campos. Ambas as tabelas podem ter uma chave primária de ID do usuário (e, portanto, ter um relacionamento 1: 1), mas nem todos os usuários terão um registro na Administratortabela. Você precisaria de algo semelhante se estiver suportando um fluxo de trabalho, por exemplo, uma ScheduledTasktabela e uma CompletedTasktabela.

Você pode querer ter uma tabela leve para dados comumente usados Usere, em seguida, uma tabela maior para detalhes que você não precisa com muita frequência UserDetails. Isso pode melhorar o desempenho, pois você poderá ajustar mais registros em uma única página de dados.

Você pode querer permissões diferentes para as tabelas, por exemplo, UsereUserCredentials

Você pode querer estratégias de backup diferentes e, portanto, colocar duas tabelas em partições diferentes, por exemplo, TransactioneTransactionArchive

Você pode precisar de mais colunas do que as suportadas em uma única tabela, por exemplo, se houver muitas colunas de texto grandes que você precise indexar e sua plataforma de banco de dados estiver limitada a páginas de dados de 4K ou o que você quiser.


Se sua tabela tiver mais colunas do que as suportadas pelo sistema de banco de dados, você terá um problema de design. Mas, caso contrário, sua resposta é sólida.
Robert Harvey

2
Concordo ... Estou tentando uma lista exaustiva, não editorializando por cada motivo.
John Wu

Qual é a sua formação em fluxos de trabalho? Você tem um software específico que você usa? Você criou seu próprio sistema de fluxo de trabalho?
Robert Harvey

1
Físico = relacionado a restrições físicas, como desempenho do servidor, tamanho da página, indexação, clustering, backups, etc. nenhuma delas deve afetar o design lógico. De uma perspectiva puramente lógica, uma única entidade deve ser conceituada como uma única tupla ou linha em uma única tabela.
John Wu

4
Link "Um relacionamento individual em um banco de dados relacional ocorre quando um campo ou registro pai possui zero ou um registro filho apenas".
John Wu #

6

Adicionando à excelente resposta de @ john-wu outro, outro motivo é quando você tem uma coluna do tipo BLOB como uma imagem.

Você deseja que essa coluna BLOB em uma tabela separada, não apenas para consultas na tabela de usuários, seja mais rápida, mas também porque você pode mover a tabela que contém o blob para um espaço de tabela diferente em um armazenamento mais lento e barato, mantendo os dados mais consultados no diretório espaço de tabela principal em um armazenamento mais rápido.


3

Os relacionamentos individuais apenas fazem sentido quando você deseja que o registro relacionado na Tabela B seja opcional.

Às vezes, o que você deseja é um registro variante ou união marcada . Isso significa que você tem várias tabelas contendo informações diferentes, mas todas relacionadas à Tabela A em relacionamentos um a um. Em seguida, você escolhe qual tabela associar com base em um campo na Tabela A

Por exemplo:

type Transaction(The_Type: PaymentType := Cash) is record

    Amount: Integer;

    case The_Type is
        when Cash =>
            Discount: boolean;
        when Check =>
            CheckNumber: Positive;
        when Credit =>
            CardNumber: String(1..5);
            Expiration: String(1..5);
    end case;
end record;

Se for opcional, como isso é diferente de tudo estar em uma tabela e apenas selecionar as colunas que você deseja?
The 29th Saltshaker

Você assume o custo de ter esses campos adicionais na tabela principal, mesmo que não haja nada neles. Se houver várias tabelas em seu registro variante, você poderá ter 100 colunas em uma única tabela, a maioria das quais não é usada na maioria das vezes.
Robert Harvey

1

Na modelagem de negócios, duas entidades A e B, que são logicamente separadas do ponto de vista comercial, geralmente são mapeadas para tabelas diferentes.

Por exemplo, ao fazer modelagem de negócios com meios orientados a objetos, você normalmente tem algum tipo de mapeamento objeto-relacional. Você pode começar com um modelo de objeto e derivar seu modelo relacional. Então, imagine no seu modelo de objeto que você criou as classes A e B, que, embora os objetos tenham uma correspondência 1: 1, devem permanecer separadas por causa do princípio de responsabilidade única . Observe que no seu modelo de objeto, essas classes não são apenas tabelas com atributos, elas podem representar objetos de negócios, com algum comportamento implementado nos métodos. E quando você mapeia essas classes agora diretamente para um modelo relacional, obtém as tabelas A e B separadas com relacionamento 1: 1.

Para minha experiência, ao criar um modelo de dados de negócios ou OO, essa separação lógica é muito mais típica para relacionamentos 1: 1 do que razões "físicas", como desempenho, segurança individual ou particionamento.


Você pode dar um exemplo concreto do que você quer dizer?
The 29th Saltshaker
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.