Pergunta

Estamos construindo uma aplicação que pode precisar ser replicado para muitos servidores (eu estou esperando que não, mas não há nenhuma maneira de saber se os clientes terão a sua própria cópia do cliente / servidor até depois que liberar o produto on-line).

Uma vez que o número de servidores é desconhecida, eu decidi GUIDs uso para qualquer IDs de tabelas transacionais. Uma vez que cada cliente tem seu próprio banco de dados, eu pretendo usar o padrão NEWSEQUENTIALID (), e a maior tabela não mais irá adicionar de 1,5 milhões de linhas por ano (mas, em média 15K linhas), eu não esperava muito de um problema de desempenho .

No entanto, eu não tenho certeza como lidar com casos onde queremos a chave estrangeira para indicar 'nenhum selecionado'. Por exemplo, um cliente tem um único usuário administrador. Isto é definido como uma chave estrangeira (login_id) para login.id (um GUID). No entanto, se um cliente ainda não tem um usuário administrador, como poderíamos facilmente configurar uma chave "Nenhum selecionado"?

Em aplicações anteriores usamos colunas de identidade, e inserida uma entrada de manequim na maioria das mesas com um ID de 0. Existe uma abordagem aceita para fornecer funcionalidade semelhante com um GUID?

Foi útil?

Solução

Você tem 3 opções:

1) Em sua tabela de referência, adicionar a linha valor em branco com um guid de todos os zeros, então conectar-se a este registro

2) Apenas armazenar um nulo para as referências em branco

3) não têm os registros em branco na tabela de referência, mas armazenar um todos zero guid. Isso pode causar problemas se junta são feitas em no banco de dados, ou com relatórios. Você vai ter que código para este caso especial.

Eu diria que 1 e 2 são os únicos boas opções.

Outras dicas

A única maneira segura de fazer isso, é definido o valor FK para NULL. Se você precisa para replicar dados entre vários servidores, certifique-se cada tabela que você replicar tem GUIDs como suas chaves primárias, relações de chave estrangeira são assim nunca é um problema.

A replicação pode funcionar muito simples desta forma: inserções em duplicado e atualizações em primeiro lugar na ordem de pai para tabela filho, depois que replicam os registros excluídos da criança ao pai. (Ordem inversa.)

Espero que isso ajude.

Eu poderia estar faltando algo realmente óbvio aqui, mas você não pode simplesmente defini-lo como NULL?

Faça o campo de chave externa na tabela filho anulável e manter o NULL campo quando não há usuário admin. valores mágicas como "0" colunas de identidade é um desastre esperando para acontecer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top