2009-08-28 5 views
1

J'ai un CMS qui a deux méthodes pour interroger le contenu. Un qui interroge par ID et un autre interroge par le nom du contenu.Dois-je rechercher du contenu dans la base de données par identifiant ou nom?

ContentManager.Select(12); 

ou

ContentManager.Select("Content Name"); 

La façon dont je vois la première serait plus rapide, car l'ID est un index et ne comporte pas la comparaison de chaînes. Alors que le second est beaucoup plus facile à travailler.

J'ai travaillé, pour des raisons de maintenance, avec le second. Mais si je change le nom du contenu, le Select ne va évidemment plus fonctionner. Mais l'Id est censé être seulement au niveau de la base de données, et non visible à partir des formulaires CMS. Editer: De plus, si un contenu devait être supprimé et réinséré, la sélection de chaîne fonctionnerait et la sélection d'id ne le ferait pas.

Je ne peux pas arriver à un point commun entre ces deux approches.

+2

Vous remarquez des problèmes de vitesse? Avez-vous fait des tests de charge pour voir si le CMS répond assez rapidement en utilisant les noms sous la charge prévue? Vous devriez pouvoir ajouter un index à la colonne de nom de contenu, bien que ce ne soit pas aussi rapide que la clé primaire. –

Répondre

1

La sélection par la touche primaire donne les meilleures performances possibles, mais ce n'est pas toujours votre seule motivation. Vous pourriez peut-être ajouter un index à la colonne de nom de contenu, selon sa largeur et votre ration de lecture/écriture (et selon le contrôle que vous avez sur la base de données, je suppose). Verdict, si vous avez l'id, sélectionnez par l'ID, si vous ne le faites pas et ne ruine pas vos performances, ne pas transpirer en utilisant le nom du contenu.

+2

Les recherches PK ne sont pas toujours 'meilleures' ... Cela dépend de l'index. si PK est une clé composite à cinq colonnes de 1000 octets de large, et qu'un autre index existe sur une clé de substitution de seulement 4 octets de largeur, la recherche sur la clé de remplacement serait plus rapide. –

+0

@Charles: Alors pourquoi voudriez-vous que votre clé primaire, et pas simplement une contrainte unique? Je ne ferais jamais cela, à moins que votre implémentation de base de données utilise toujours la clé primaire comme un index cluster ou quelque chose. – Thorarin

+0

Je limitais mon exemple à la discussion très simple que nous avons de deux colonnes qui, pour autant que je sache, identifient de façon unique une rangée. Techniquement dans ce cas, le 'id' est une clé de substitution de la colonne de chaîne, si en fait la colonne de chaîne identifie la ligne de façon unique. La colonne 'id' a juste l'index en cluster, alors pouvez-vous faire beaucoup de trucs bizarres pour bousiller une clé primaire et rendre ses recherches moins qu'idéales? Absolument. Mais dans le cas général avec une clé primaire indexée en cluster sur un entier, la colonne la plus probable étant auto-incrémentée, la recherche par identifiant est la plus rapide. – marr75

1

Dépend lequel est indexé ... Alors oui, vous avez raison, dans ce cas, utilisez l'ID ... S'il est nécessaire de chercher aussi par nom, ajouter un autre index en utilisant le nom ..

+0

La version 'ID' serait encore plus rapide si c'était la colonne utilisée pour l'index clusterisé. En supposant que vous récupérez la ligne entière qui est. – Thorarin

+0

pour récupérer une ligne, peu importe .. Si l'index a, disons, six niveaux, il serait sept IOs contre six ...pour récupérer un ensemble de lignes entre deux valeurs d'index cluster, l'index cluster est massivement plus rapide. –

0

ID fonctionnent généralement mieux dans les bases de données. Cependant, vous êtes à la merci du CMS, il peut être stocké à la fois dans un tableau et en utilisant la même instruction select. Qui sait? voir le code source et voir ce qui se passe.

quoi que vous fassiez, respectez un style dans tout votre code.

Questions connexes