Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Projetando relacionamentos 1:1 e 1:m no SQL Server


Qualquer relacionamento requer que a tabela "pai" (de um lado) tenha uma chave primária (ou exclusiva) (PK), que identifique exclusivamente cada linha, e a tabela "filho" (do outro lado) tenha uma coluna ou colunas de chave estrangeira , que deve ser preenchido com valores iguais a alguns valores existentes da Chave Primária na tabela pai. Se você deseja um relacionamento de um para muitos (1-M), a chave estrangeira deve ser um atributo comum (coluna ou colunas) na tabela filha que pode ser repetida (pode haver muitas linhas com o mesmo valor)

Se você deseja um relacionamento de um para um (1-1), a chave estrangeira deve ser uma chave primária ou um índice exclusivo na tabela filho que garante que pode haver no máximo uma linha na tabela filho com esse valor.

Um relacionamento 1-1 efetivamente particiona os atributos (colunas) em uma tabela em duas tabelas. Isso é chamado de segmentação vertical. Isso geralmente é feito para subclasses as entidades da tabela ou, por outro motivo, se os padrões de uso nas colunas da tabela indicarem que algumas das colunas precisam ser acessadas com uma frequência significativamente maior do que o restante das colunas. (Digamos que uma ou duas colunas serão acessadas 1000 vezes por segundo e as outras 40 colunas serão acessadas apenas uma vez por mês). Particionar a tabela dessa maneira otimizará o padrão de armazenamento para essas duas consultas diferentes.

Subclasse . O acima realmente cria um relacionamento de 1 para zero ou um, que é usado para o que é chamado de relacionamento de subclasse ou subtipo. Isso ocorre quando você tem duas entidades diferentes que compartilham um grande número de atributos, mas uma das entidades possui atributos adicionais que a outra não precisa. Um bom exemplo pode ser Funcionários , e Funcionários Assalariados . O Funcionário tabela teria todos os atributos que todos os funcionários compartilham, e o SalariedEmployee existiria em um relacionamento (1-0/1) com Funcionários, com os atributos adicionais (Salário , Férias Anuais , etc.) que apenas os funcionários assalariados precisam.

Se você realmente deseja um relacionamento 1-1, precisa adicionar outro mecanismo para garantir que a tabela filho sempre tenha um registro para cada registro/linha na tabela pai. Geralmente, a única maneira de fazer isso é aplicando isso no código usado para inserir dados (em um gatilho, procedimento armazenado ou código fora do banco de dados). Isso ocorre porque se você adicionasse restrições de integridade referencial em duas tabelas que exigem que as linhas sempre estejam em ambas, não seria possível adicionar uma linha a nenhuma delas sem violar uma das restrições e você não pode adicionar uma linha a ambas mesas ao mesmo tempo.