Essa é uma maneira padrão de criar um banco de dados?

8

Recentemente, aprendi sobre como os relacionamentos são definidos no banco de dados no trabalho e fiquei imaginando se essa é uma prática padrão.

Digamos que temos dois processos: Processo A e Processo B. O processo B depende dos resultados do Processo A, portanto, existe um relacionamento que precisa ser definido entre uma execução do Processo B e uma execução do Processo A. É assim que o relacionamento é definido:

TableProcessA:
Id

e

TableProcessB:
Id
ProcessAId

Agora, até este ponto, as coisas fazem sentido para mim, mas as coisas ficam um pouco estranhas para mim e para minha compreensão do design da mesa. Sempre que uma linha é criada em TableProcessA ou TableProcessB, uma função é chamada que cria um ID globalmente exclusivo para cada um. Portanto, basicamente, todos os campos de ID em TableProcessA e TableProcessB não conterão nenhuma correspondência, porque os IDs não são apenas exclusivos de sua tabela, mas de todo o banco de dados.

Minha pergunta é: qual é o padrão? Fui criado com a idéia de que cada tabela deveria simplesmente ter um ID de incremento automático exclusivo da tabela e não de todo o banco de dados.

sooprise
fonte
3
pode ser de interesse: dba.stackexchange.com/questions/322/…
Derek Downey
Louis Davidson tem muitas postagens sobre o design do banco de dados: sqlblog.com/blogs/louis_davidson/archive/tags/Database+Design/… . Tenha cuidado ao armazenar dados separadamente por processo, a menos que seja apenas para log.
Eric Humphrey - lotsahelp

Respostas:

7

Esta não é uma prática tão estranha. Esses são chamados GUIDs ou IDs globalmente exclusivos. A idéia é que, dado um GUID, você possa dizer exatamente a que parte de dados o ID pertence, pois será único em qualquer lugar . Os GUIDs são mais usados ​​quando você mescla fontes diferentes de dados semelhantes; por exemplo, inventário para diferentes lojas.

Eu faria algumas pesquisas e descobriria por que essa é uma prática comum em seu ambiente. Talvez seja necessário, talvez não seja.

DForck42
fonte
4

Em princípio, ter IDs únicos em um banco de dados não é tão ruim, mas é bastante incomum na minha experiência. A menos que haja um requisito específico para manter chaves de ID globalmente exclusivas, o uso da identidade normal deve ser bom, pois os tipos ou objetos de entidade tendem a ser específicos ao tipo e geralmente não resultam em junções inadequadas.

Como um aparte de sua pergunta, sugiro enfaticamente não usar GUIDs como chaves primárias ou substitutas, pois ocupa quatro vezes o espaço de um int. Agora, nos dias de discos com vários gigabytes, você pode dizer que não é importante, mas quando você tem alguns milhões de linhas de dados, ainda são necessários recursos para ler do disco ou transferir através de uma rede, ainda mais se eles forem incluídos em quaisquer índices. Enquanto eu estou nos índices de assuntos, os GUIDs são ruins nas chaves primárias devido à natureza aleatória e geralmente causam fragmentação significativa.

Agora é provável que seja tarde demais para esse banco de dados, mas lembre-se disso para o futuro

GrumpyMonkey
fonte
4

Seus processos podem criar registros que contêm o GUID como uma referência à instância do processo, mas o uso dos GUIDs como chave não é necessariamente ideal.

Vejo três principais desvantagens do uso de GUIDs como chaves do banco de dados e as evitaria a menos que você tenha algum motivo convincente para usá-las. Observe que a propriedade globalmente exclusiva não oferece vantagens sobre o uso de uma chave que é localmente exclusiva em uma tabela, porque você já sabe de qual tabela os dados vieram.

Inconveniência: não é muito fácil digitar um GUID se você deseja fazer uma consulta ad-hoc do banco de dados, por exemplo:

select *
  from Foo
 where FooID = 12345

vs

select *
  from Foo
 where FooID = convert (uniqueidentifier, '5E64E653-35F0-4803-B459-F5F59C701F22')

O último praticamente significa que você precisa de uma fonte do GUID para recortar e colar.

2. Ordinalidade natural: uma chave primária de incremento automático tem o efeito colateral de ordenar naturalmente suas transações na ordem em que foram inseridas no sistema. Isso geralmente é bastante útil. Os GUIDs normalmente não são gerados em ordem; portanto, eles não são úteis nesse sentido.

3. Tamanho: menos de um problema nos dias de hoje, mas um GUID tem 16 bytes de comprimento. Ocupa mais espaço na tabela e quaisquer índices que a incluam.

ConcernedOfTunbridgeWells
fonte
O ID globalmente exclusivo é, na verdade, um número inteiro que apenas ++ é sempre que existe um novo. Essa é uma prática comum ou os GUIDs sempre têm 16 bytes?
sooprise
Os GUIDs são 128 bits (16 bytes), de modo a ter um espaço para nome suficientemente grande. Tradicionalmente, eles incluem itens exclusivos, como endereços MAC e carimbos de data e hora, para dar a parte do valor uma base genuinamente única. Gostaria de saber que tipos são seus identificadores e se eles são realmente GUIDs - normalmente os GUIDs são pelo menos parcialmente aleatórios.
ConcernedOfTunbridgeWells
Os IDs são gerados pesquisando todos os IDs, obtendo o máximo e adicionando 1.
#
0

Não vou dizer que é normal, mas também não é anormal definir as coisas dessa maneira.

Mrdenny
fonte
2
-1 como está, esta resposta realmente não fornece nada útil.
Derek Downey
11
tecnicamente ele faz responder à pergunta
DForck42
2
Respostas sim. Fornece qualquer coisa útil, não.
Matt Hanson
Denny - como moderador e um DBA altamente experiente, estou surpreso por você não ter acrescentado um pouquinho mais de detalhes à sua resposta. Talvez seja bom dizer por que gerar aleatoriamente um GUID é uma prática ruim em geral ou por que realmente não representa um problema em termos de exclusividade. Tal como está, o sistema quer saber se devo recomendar a exclusão da sua postagem.
Max Vernon