2017-06-29 2 views
0

Étant donné une table avec des dizaines de colonnes, plusieurs milliers de lignes et aucune dépendance fonctionnelle connue entre les colonnes, existe-t-il un algorithme pour trouver automatiquement une clé candidate pour cette table plus rapide ou plus efficace que ceci:Algorithme de recherche de clé candidate sans dépendances fonctionnelles

  1. Vérifiez si une seule colonne est une clé candidate
  2. Vérifiez si les 2 colonnes sont un candidat clé

  3. Vérifiez si les 3 colonnes sont un candidat clé

... et ainsi de suite jusqu'à ce qu'une clé soit trouvée?

Répondre

0

La clé primaire de la table doit être unique. Si votre ensemble de données augmente avec le temps, il ne suffit pas de vérifier si les colonnes sont maintenant uniques. Ils devront être uniques pour toujours. Donc, dans ce cas, j'éviterais un PK naturel et choisirais une clé de substitution.

Si vous êtes 100% sûr qu'il doit y avoir une clé naturelle, mais vous ne savez pas que les colonnes que vous commencez à déterminer la cardinalité distincte des colums:

SELECT COUNT(*), 
     COUNT(DISTINCT column1), 
     COUNT(DISTINCT column3), 
     ... 
FROM table 

Si, pour une colonne distincte de la nombre de valeurs est égal au nombre total de lignes que vous avez trouvé la clé. S'il s'agit de plusieurs colonnes, vous devez adopter une approche d'essai et d'erreur. Vous savez que le produit des valeurs des colonnes distinctes de vos candidats clés doit être supérieur ou égal au nombre total de lignes

COUNT(DISTINCT key_column1) * COUNT(DISTINCT key_column2) * COUNT(DISTINCT key_column3) >= COUNT(*) 

Sachant cela, vous pouvez rechercher des combinaisons plausibles comme si

SELECT COUNT(DISTINCT key_column1 || key_column2 || key_column3), COUNT(*) 
FROM table 

Si la table ne dispose que de quelques milliers de lignes, les performances ne devraient pas poser problème.

I gutes vous pouvez rendre ceci entièrement automatique en utilisant le dictionnaire de données mais je n'ai aucune solution à portée de main.

+0

Merci de répondre. Pour clarifier: L'ensemble de données ne grandit pas et je suis sûr qu'il y a une clé naturelle mais je ne sais pas laquelle. Je connais tout le contrôle si le non. de valeurs distinctes dans un ensemble de colonnes est égal au non. de lignes distinctes dans la table et d'optimisation avec le critère de multiplication, mais il y a un nombre croissant de combinaisons que vous vérifiez pour les plus grands sous-ensembles. Aussi, bien que je ne l'ai pas mentionné, je veux le faire sur plusieurs tables (environ 100), donc le besoin d'un algorithme, qui trouve une clé plus efficacement que la méthode bruteforcish que j'ai décrite, sans que je doive vérifier tables individuelles. –