web-dev-qa-db-fra.com

Clé primaire Varcharne - MySQL

Actuellement, j'ai une table categories avec 2 colonnes - category VARCHAR(50) NOT NULL PRIMARY KEY et parent VARCHAR(50). La colonne parent est une clé étrangère (FK) à la colonne category.

Cela semble être l'approche la plus évidente. Cependant, les cloches d'alarme sonnent dans ma tête parce que j'utilise une colonne VARCHAR pour une clé primaire, ce qui pourrait ralentir les opérations lors de la mise en place de la table.

Je pourrais introduire une troisième colonne appelée cat_id INT AUTO_INCREMENT Et définissez cela pour être le PK, mais cela introduirait une nouvelle colonne qui n'a aucun sens.

En dehors de laquelle on serait plus rapide, quelles autres considérations devraient être prises?

NB I Prédire là-bas, il y aura au plus 1000 catégories, de sorte que le nombre de lignes ne soit pas très élevé. Cependant, la colonne categories pk sera une colonne de référence pour de nombreuses clés étrangères, dans d'autres tables. .

Devrais-je utiliser des noms d'utilisateur (uniques) comme pk's aussi?

7
dayuloli

Oui, j'ajouterais une clé entière de 4 octets de substitution. Vos deux colonnes actuelles sont 100 octets, cela pourrait ensuite être réduit à 58 octets par addition de la nouvelle colonne d'identité. Vous pouvez même faire la clé de substitution de la clé de substitution un smallint 2 octets si vous êtes sûr que vous ne dépasserez jamais 65 535 catégories (pourrait être toujours une bonne idée de partir comme INT au cas où).

Les économies d'espace ne sont pas formidables pour une table de 1 000 rangées, mais c'est oùt_id est ajouté à d'autres tables, vous pouvez enregistrer un espace important (4 octets au lieu de 50 dans chaque FK). Vous voudrez probablement également indiquer ces clés étrangères, de sorte que les économies d'espace seront encore plus grandes dans tous vos index non clusters.

De plus, votre indice en cluster est maintenant séquentiel pour éviter la fragmentation (scissions de page) lors de l'ajout de nouvelles catégories

Structure de la table: -

create table dbo.Cateogory (
    CateogoryID int not null identity(1,1) constraint pkCateogory primary key clustered,
    Cateogory varchar(50) not null constraint ukCateogory unique nonclustered,
    ParentCateogoryID int null constraint fkCateogory references dbo.Cateogory(CateogoryID)
    )

Vous pouvez également ajouter des options d'index dans la production (Fillactor, etc.) en fonction de vos besoins.

7
Andy Jones