2011-11-13 3 views
1

J'ai été mentionné que j'ai besoin et auto-incrémentant id pour garder une trace des enregistrements uniques ... ... fondamentalement ... une clé PRIMAIRE pointant vers un int auto-incrémentantImplémentation de champ INDEX dans le contexte d'une clé primaire et auto-incrémentant int

Je peux le voir comme les données de l'utilisateur sont mutables..il change ... si vous donnez à chaque ligne un ID, il sert à mieux suivre l'utilisateur et ne prend pas trop beaucoup d'espace - 4 octets.

J'ai aussi entendu dire que le champ INDEX est utilisé comme un moyen de faire accélérer les recherches ..

Si j'ai un ensemble d'attributs utilisateur dire, A1, A2, A3, et j'ai une clé primaire, P, défini comme un int je ... comment un INDEX se rapporte à cela? .. ie comment puis-je l'implémenter correctement?

Colonnes -

int, varchar, varchar, varchar,....Primary Key, Index ? 

I, A1, A2, A3..., P, ? 

Répondre

1

MySQL:

  • la clé primaire est un indice
  • la colonne AUTO_INCREMENT doit être la clé primaire
  • KEY est synonyme de INDEX

Donc dans votre exemple I serait déclarée ainsi

CREATE TABLE (
    I int NOT NULL AUTO_INCREMENT, 
    ... 
    PRIMARY KEY (I) 
    ... 

Cependant, ceci est une clé « de substitution », car il n'est pas la clé naturelle (par exemple, numéro d'employé) de sorte que vous auriez un index unique (ou clé) sur ce trop

D'autres index seraient créés sur des colonnes individuelles ou des combinaisons de colonnes en fonction de leur utilisation dans JOINs et WHERE, mais les stratégies d'indexation en général sont distinctes du choix d'une clé primaire pour votre table.

+0

O.K donc si je définis quelque chose comme clé primaire, je peux être assuré que lorsque je fais une recherche dessus ... que la recherche est efficace .. c'est-à-dire. que les données sont mises dans un arbre B comme décrit ici - http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html –

+0

Il sera indexé? –

+0

Je ne veux pas utiliser une clé de substitution ... juste pour utiliser votre premier exemple .. est-ce O.K.? –

0

On dirait que vous avez une relation 1: M, en ce sens qu'un utilisateur peut avoir de nombreux attributs. Je recommande une 2ème table stockant les attributs d'une clé étrangère à la table d'utilisateur:

create table `user` (
    `id` int(11) unsigned not null auto_increment, 
    `first_name` varchar(60) not null, 
    primary key (`id`) 
)engine=InnoDB default charset=utf8; 

create table `user_attribute_link` (
    `id` int(11) unsigned not null auto_increment, 
    `user_id` int(11) unsigned not null, 
    `attribute_id` int(11) unsigned not null,  
    primary key (`id`), 
    index (`user_id`, `attribute_id`), 
    foreign key (`user_id`) references `user` (`id`) on delete cascade 
    foreign key (`attribute_id`) references `user_attribute` (`id`) on delete cascade 
)engine=InnoDB default charset=utf8; 

create table `user_attribute` (
    `id` int(11) unsigned not null auto_increment, 
    `name` varchar(60) not null, 
    primary key (`id`), 
    unique key (`name`), 
)engine=InnoDB default charset=utf8; 

Le FK de la table utilisateur à la table de user_attribute assurera si vous supprimez une ligne de l'utilisateur, toutes les lignes de l'enfant de user_attribute sera également supprimé. Une clé unique a également été ajoutée à la table attributaire pour vous assurer que vous ne pouvez pas ajouter d'attributs de dupe.

EDIT Mise à jour du schéma avec une 3ème table supportant un M: M (via 1: M - M: 1). Cela permettra plus de flexibilité si vous avez besoin d'ajouter plus d'informations sur les attributs de l'utilisateur.

+0

Cela devient moche si les attributs ont des types différents, car il devient un EAV http://karwin.blogspot.com/2009/ 05/eav-fail.html ou http://programmers.stackexchange.com/questions/93124/eav-is-is-really-bad-in-all-scenarios – gbn

+0

@gbn: D'accord, offert une solution basée sur l'OP , mais j'ai mis à jour le schéma pour prendre en charge la flexibilité des attributs utilisateur. –

Questions connexes