AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 121238
Accepted
Juan Velez
Juan Velez
Asked: 2015-11-17 06:52:26 +0800 CST2015-11-17 06:52:26 +0800 CST 2015-11-17 06:52:26 +0800 CST

Encontrar programaticamente o conjunto mínimo de campos necessários para criar uma chave composta exclusiva

  • 772

Estou importando arquivos simples de diferentes fontes para tabelas no SQL Server. Estou criando uma chave primária composta usando uma combinação de campos das extrações que me fornecerão uma chave exclusiva para cada linha.

A maneira como faço agora é começar com 1 campo e continuar concatenando os campos até encontrar uma chave exclusiva para todos os registros. Isso pode consumir um pouco de tempo ou posso acabar concatenando mais colunas do que realmente precisava para obter a chave exclusiva.

Existe algum tipo de script SQL que eu possa executar em uma tabela que me forneça o número mínimo de campos (nomes) que eu precisaria concatenar para obter uma chave exclusiva? Portanto, se houver 1 campo na tabela que seja exclusivo para todos os registros, esse 1 nome de campo será retornado. Se eu precisasse concatenar [memberid], [claimid] e [date of service] para obter uma chave exclusiva, esses 3 nomes de campo seriam o resultado do script.

sql-server database-design
  • 4 4 respostas
  • 1891 Views

4 respostas

  • Voted
  1. Dave
    2015-11-17T08:54:04+08:002015-11-17T08:54:04+08:00

    Embora comentários e srutzky ofereçam ótimos conselhos, existe uma ferramenta feita exatamente para a sua situação. O SSIS Data Profiling Taskdestina-se à identificação de chaves primárias em potencial (para várias colunas), além de fornecer muitos outros insights úteis sobre seus dados.

    Basta criar um novo pacote SSIS, adicionar a tarefa e usar a interface semelhante a um assistente para criar o perfil de seus dados. Crie um novo arquivo de saída em algum lugar onde você possa acessá-lo, selecione Quick Profile...e crie o perfil das informações apropriadas do banco de dados e da tabela desejada.

    insira a descrição da imagem aqui

    Depois de terminar, execute o pacote e retorne ao componente para selecionar Open Profile Viwer...e observar todos os dados interessantes! A ferramenta me deu uma correspondência de 96% para uma das minhas tabelas de fatos para um PK de três colunas quando até 7 colunas foram solicitadas para a consideração de chave candidata (não mostrada).

    insira a descrição da imagem aqui

    Só para deixar claro, eu definitivamente concordo que as regras de negócios devem determinar a exclusividade dos dados... só porque você encontra uma combinação de colunas que se ajusta aos seus dados para exclusividade não significa necessariamente que faça algum sentido. =)

    • 5
  2. Best Answer
    Solomon Rutzky
    2015-11-17T07:43:39+08:002015-11-17T07:43:39+08:00

    Estou criando uma chave primária composta usando uma combinação de campos das extrações que me fornecerão uma chave exclusiva para cada linha.

    Hum, não é exatamente para isso que serve uma chave primária. Sim, eles identificam exclusivamente cada linha, mas também são a base dos relacionamentos de suporte para tabelas irmãs e filhas.

    Existe algum tipo de script SQL que eu possa executar em uma tabela que me forneça o número mínimo de campos (nomes) que eu precisaria concatenar para obter uma chave exclusiva?

    Não fora do que você já está fazendo, embora talvez de formas ligeiramente diferentes, como possivelmente carregar os dados em uma tabela sem chaves ou índices exclusivos ou restrições exclusivas definidas e, em seguida, tentar criar o PK ou Unique (Index | Constraint) em várias combinações de campos. Em ambos os casos, você provavelmente não deveria estar fazendo isso em primeiro lugar.

    Existem alguns problemas com essa abordagem em geral:

    • E se houver várias opções de exclusividade? Qualquer combinação de um ou mais campos individuais e/ou um ou mais conjuntos de campos múltiplos? FieldApode ser único e FieldD+ FieldHpode ser único. O que então?
    • E se nenhum campo individual ou combinação de campos for exclusivo? Qual é o plano se o uso de todos os campos ainda não resultar em exclusividade?
    • E quanto a dados inválidos e/ou erros em seu processo de importação? A varredura dos dados recebidos é altamente propensa a erros devido a não saber o quanto você pode confiar nos dados para começar. Seu sistema precisa entender se os dados recebidos são bons ou ruins, não apenas assumir que são bons e basear as regras de negócios em torno do que poderia facilmente ser um bug no processo de exportação do sistema externo (porque isso nunca acontece ;-) .
    • Alguma dessas tabelas de importação deve estar relacionada entre si? Em caso afirmativo, tentar encontrar exclusividade programaticamente pode escolher campos diferentes para tabelas que devem se relacionar, mas agora não podem devido à exclusividade encontrada em várias combinações de campos em pelo menos uma das tabelas e o processo encontrando uma combinação incompatível antes do combinação relacionável.
    • Como você está decidindo quais são os tipos? E sobre 0x02FB4C97? Isso é um VARBINARYou uma string de bytes hexadecimais? E sobre 123456? Isso é um INT, BIGINT, VARCHAR, DATETIME(no formato juliano), VARBINARY(sem a liderança , 0xmas não A- Fpara ajudar a decidir)?
    • O que acontece quando os "dados" em uma ou mais colunas mudam radicalmente, mas por razões boas/naturais? E se houver um campo vazio no momento e você achar que é uma string, mas na verdade é um campo de data que ainda não foi usado ou, naturalmente, é NULLpara a exportação específica que você está procurando? Ou que tal comprimentos máximos para colunas de comprimento variável? Que tal um campo de "comentários" que eles estão usando atualmente apenas para um número de 5 dígitos, mas depois começam a usá-lo para comentários reais?
    • Como @MaxVernon mencionou em um comentário sobre a pergunta, a exclusividade dos campos pode mudar à medida que novos dados chegam mais tarde, pois você realmente não conhece as regras que governam como os dados realmente existem.

    Então, isso se resume a: qual é o objetivo real de definir os PKs para começar? O que você está tentando realizar fazendo isso? Existe uma razão pela qual você não apenas adiciona um IDENTITYcampo e remove duplicatas em todos os campos importados (todos menos o IDENTITYcampo)?

    Você realmente precisa descobrir mais sobre a verdadeira natureza dos dados primeiro e, em seguida, criar uma tabela para armazenar os dados com chaves e restrições que correspondam a como os dados devem existir, não necessariamente como eles existem.

    • 3
  3. Marco
    2015-11-17T07:00:28+08:002015-11-17T07:00:28+08:00

    Não pense que existe um script para isso. Ele precisa ser decidido/definido antes que os dados sejam inseridos. Caso contrário, pode bloquear o funcionamento do seu aplicativo.

    Normalmente uma tabela precisa de 1 campo para ser única. Somente se você criar uma tabela para vincular 2 tabelas diferentes (para uma relação N-para-M), precisará das chaves M e N para torná-la única. Há exceções, mas cabe ao designer decidir quais campos compõem a chave exclusiva. Os dados podem crescer e a exclusividade também.

    • 0
  4. Raphael
    2016-11-16T08:59:45+08:002016-11-16T08:59:45+08:00

    Embora eu concorde com algumas postagens de que as chaves devem ser definidas pelo caso de negócios, isso me parece ser a visão da perspectiva de um administrador de banco de dados.

    Do ponto de vista da análise de dados, onde você pode enfrentar um conjunto de dados estáticos que deseja analisar, essas combinações de teclas podem ser interessantes e úteis. Imagine uma situação em que você encontrou um subconjunto de dados e está se perguntando quais são os campos-chave que o determinam. Por exemplo, vamos supor que você encontrou um subconjunto de pedidos para alguma combinação de produtos e se pergunta quais são os parâmetros que melhor definem esses pedidos.
    Claro que você pode defini-los por seus IDs de pedido, mas pode haver uma combinação de teclas menor e mais interessante, como a idade do cliente e a hora em que o pedido foi feito.

    Esse é um problema típico de agrupamento/classificação.

    • -1

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve