2009-05-11 6 views
3

J'ai une table qui a deux colonnes varchar (Max)Dois-je utiliser une clé primaire générée automatiquement si je ne fais que la recherche d'une table?

Column 1  Column 2 
----------------------- 
URLRewitten OriginalURL 

sa part de mon URL réécrivant pour un site WebForms de asp.net. Quand une url arrive, je fais une vérification pour voir si c'est dans la table si j'utilise l'OriginalURL. Ma question est, si tout ce que je fais est d'interroger la table pour les URL et aucune autre table dans la base de données ne liera jamais à cette table a-t-elle besoin d'un champ de clé primaire dédié? comme un numéro automatique? Est-ce que cela rendra les requêtes plus rapides?

et comment puis-je rendre la requête plus rapide?

Modifier: J'ai une contrainte unique sur URLRewitten.

Modifier: façons j'utilise ce tableau ..

  • Requête lorsqu'une nouvelle requête arrive .. recherche sur URLRewitten pour trouver originalUrl
  • Lorsque besoin d'afficher un lien sur le site, i requête sur l'OriginalURL pour trouver l'url URLRewitten que je devrais utiliser.
  • Lors de l'ajout d'une nouvelle URL à la table, je m'assure qu'elle n'existe pas déjà.

thats tous les querys je fais .. pour le moment.

Les deux colonnes ensemble seraient uniques.

Répondre

12

Avez-vous besoin d'une clé primaire? Oui. Toujours. Cependant, il semble que dans votre cas, OriginalURL pourrait être votre clé primaire (je suppose qu'il n'y aurait pas plus d'une valeur pour URLRewritten pour une valeur donnée dans OriginalURL).

C'est ce qu'on appelle une «clé naturelle» (où un composant des données lui-même est, par sa nature, unique). Ceux-ci peuvent être pratiques, bien que j'ai trouvé qu'ils sont généralement plus de problèmes qu'ils valent dans la plupart des circonstances, donc oui, je recommanderais une sorte de clé opaque (ce qui signifie une clé qui n'a aucun rapport avec les données de la rangée , autre que d'identifier une seule ligne). Si vous voulez ou non un numéro automatique est à vous. C'est certainement pratique, bien que les colonnes d'identité viennent avec leur propre ensemble d'avantages et d'inconvénients.

Pour l'instant, je suppose que je vous conseille la création de deux choses:

  1. Une clé primaire sur la table d'une colonne d'identité
  2. Une contrainte unique sur originalUrl pour faire respecter l'intégrité des données.
+1

-1 les clés primaires ne sont pas requises – Andomar

+6

+1 Ne jamais créer une table sans clé primaire. Fin de l'histoire. –

+3

@Andomar: J'espère que tout employeur éventuel lit cette déclaration. Il n'y a aucune excuse pour ne pas avoir une clé primaire de QUEL genre sur une table permanente. –

1

Une colonne d'identité peut aider lorsque vous recherchez des événements récents:

select top 100 * from table order by idcolumn desc 

Nous aurions dû savoir quel type de requêtes que vous utilisez, avant que nous puissions rechercher un moyen de les rendre plus rapides .

5

J'en mettrais un de toute façon ... cela faciliterait beaucoup la mise à jour ou la duplication d'une règle existante ...

-à-dire c'est plus facile

UPDATE Rules SET OriginalURL = 'http://www.domain.com' WHERE ID = 1 

--OR 

INSERT INTO Rules SELECT OriginalUrl, NewUrl FROM Rules WHERE ID = 1 

Que ce

cela est plus facile

UPDATE Rules SET OriginalURL = "http://www.domain.com" WHERE OriginalURL = 'http://old.domain.com' 

--OR 

INSERT INTO Rules SELECT OriginalUrl, NewUrl FROM Rules WHERE OriginalURL = 'http://old.domain.com' 

En termes de performance, si vous allez être à la recherche par originalUrl, vous devez ajouter une index de cette colonne,

+0

La question spécifie qu'il n'y a pas besoin de mises à jour: "si tout ce que je fais est d'interroger la table pour les URLs" – Andomar

+0

Il y a toujours besoin de mises à jour. Qu'arrive-t-il s'il a une faute de frappe dans l'une de ses URL et remarque un moment après son insertion? Je suppose qu'il voulait dire "n'aura pas besoin d'être régulièrement mis à jour" –

1

Comme vous faites votre qu Sur la colonne URLRewritten, je ne pense pas que l'ajout d'une clé primaire auto-générée puisse vous aider.

Avez-vous un index dans votre colonne URLRewritten? Si ce n'est pas le cas, créez-en un: vous devriez voir une augmentation importante de la vitesse de vos requêtes (peut-être simplement faire URLRewritten votre clé de primay?).

0

Je ne pense pas que l'ajout d'une clé primaire générée automatiquement rendra votre requête plus rapide.

Cependant il y a quelques choses à considérer:.

  1. Je ne serais pas si sûr, qui ne jamais rien relieront à cette table :(
  2. J'ai vu beaucoup des personnes posant des questions sur comment dire supprimer les doublons de table comme cela - avec clé primaire, il est beaucoup plus facile
  3. pour faire cette requête plus vite nous devons savoir m. minerai de cette table et des moyens de l'utiliser ...

À mon avis, toutes les tables , doit avoir généré automatiquement la clé primaire (à savoir identité dans MSSQL).

Je ne crois pas aux clés naturelles uniques.

0

Oui il devrait y avoir une clé primaire Parce que vous pouvez définir INDEX sur cette clé primaire pour un accès rapide

2

J'utiliser la originalUrl comme clé primaire que je suppose que ce qui est unique. En supposant que vous utilisez SQL Server, vous pouvez créer un index sur RewrittenURL avec OrigionalURL en tant que colonne "Inclus" pour accélérer les performances de la requête.

Questions connexes