Test Foro de elhacker.net SMF 2.1

Programación => Desarrollo Web => Bases de Datos => Mensaje iniciado por: ma__tt en 24 Diciembre 2009, 13:48 PM

Título: Diferencia KEY y PRIMARY KEY
Publicado por: ma__tt en 24 Diciembre 2009, 13:48 PM
Hola, no entiendo cuales la diferencia entre que una clave sea KEY o PRIMARY KEY. Alguién puede aclararme esto?  :)

Muchas gracias
Título: Re: Diferencia KEY y PRIMARY KEY
Publicado por: ^Tifa^ en 24 Diciembre 2009, 15:51 PM
Ambos son indices. La mayor diferencia radica en que KEY accepta valores nulos y repetidos, sin embargo PRIMARY KEY no accepta valores nulos ni repetidos  ;)
Título: Re: Diferencia KEY y PRIMARY KEY
Publicado por: ma__tt en 24 Diciembre 2009, 17:25 PM
Vale, capto xd  Ahora bien, he visto en un diseño de una base de datos, que en todas las tablas, tenía un campo (o varios) con primary key, y el resto de atributos puestos como key. La explicación que da es que así se mejora los tiempos de búsqueda. Como véis esto? Una chapuza... es necesario o puede venir bien?... no se debe hacer nunca... en fin, a ver vuestra opinión cuál es y ya de paso, si podéis explicarme que implicaciones tiene esta forma de proceder :P

muchas gracias
Título: Re: Diferencia KEY y PRIMARY KEY
Publicado por: seba123neo en 24 Diciembre 2009, 21:24 PM
claro las claves de una tabla la pueden conformar varios campos (indices compuestos), ponerle indices a las tablas es necesario para como decis, acelerar en lo tiempos de busqueda, por experiencia que he visto consultas (habia una consulta que bajo de 1 minuto a 2 segundos con solo agregarle un indice), pero los indices no van en cualquier campo, sino en los que vas a usar en el WHERE, y que presenten valores repetidos. ^TiFa^ te lo puede explicar mejor, pero creo que ya esta cansada de explicar siempre lo mismo ;D, porque ya hubo un post parecido. igualmente te sugiero que hagas una busqueda en internet sobre "que son los indices" y te aseguro vas a encontrar un monton de paginas que te explican muy bien.

saludos.
Título: Re: Diferencia KEY y PRIMARY KEY
Publicado por: ^Tifa^ en 24 Diciembre 2009, 22:27 PM
Lol seba123neo

Haber chico depende, suponte que quieres la informacion (nombres, apellidos, telefonos) de distintas personas. Procedes a crear 1 sola tabla con todos los datos asumiendo que es suficiente:

Código (sql) [Seleccionar]

SQL> create table data(
  2  nombres char(20),
  3  apellidos char(20),
  4  id integer,       
  5  primary key(id),       
  6  telefono nchar(20));

Table created.


Y vienes y quieres insertarle datos ahora:

CitarSQL> insert into data values('Juan Manuel', 'Perez', 1, '555-2344');

1 row created.

SQL> insert into data values('Juan Manuel', 'Perez', 1, '666-3455');
insert into data values('Juan Manuel', 'Perez', 1, '666-3455')     
*                                                                   
ERROR at line 1:                                                   
ORA-00001: unique constraint (MARIAN.SYS_C005303) violated         


Te da error porque obviamente el campo ID que es primario no accepta valores repetidos, por ende o obvias tener el campo primario o le agregas otro valor distinto a 1 pero en este caso terminarias con algo tipo:

Código (sql) [Seleccionar]


SQL> select * from data;

NOMBRES              APELLIDOS                    ID TELEFONO
-------------------- -------------------- ---------- --------------------
Juan Manuel          Perez                         1 555-2344           
Juan Manuel          Perez                         2 555-2344
Juan Manuel          Perez                         3 555-2344



O quizas quieras resolver rapido, y en vez de declarar el campo ID como primary key lo declares como KEY o INDEX para repetir valores y terminarias con algo tipo:

Código (sql) [Seleccionar]

SQL> select * from data;

NOMBRES              APELLIDOS                    ID TELEFONO
-------------------- -------------------- ---------- --------------------
Juan Manuel          Perez                         1 555-2344           
Juan Manuel          Perez                         1 678-2344
Juan Manuel          Perez                         1 777-2234



Que a la hora de consultar la tabla seria mas rapido en retornarte el valor que si hicieras JOIN con otra, pero aunque esto a nivel de optimizacion es mas rapido, te dejaria valores repetidos y redundantes en la tabla como el ejemplo expuesto anteriormente... por ende en su lugar seria favorable eliminar el campo telefono de la tabla Data y crear otra tabla que haga referencia al telefono de cada usuario.

Código (sql) [Seleccionar]

SQL> create table copia(
  2  id integer,       
  3  telefono nchar(20));

Table created.

SQL> create index indice on copia(id);

Index created.




Le insertas datos:

Código (sql) [Seleccionar]

SQL> insert into copia values(1,'666-7655');

1 row created.

SQL> insert into copia values(1, '765-4599');

1 row created.

SQL> select * from copia;

        ID TELEFONO
---------- --------------------
         1 666-7655
         1 765-4599




Y ya tienes una tabla no desnormalizada donde puedes agregar todos los telefonos que quieras para un usuario en especifico, y consultar esos datos de retorno:

Código (sql) [Seleccionar]

SQL> select a.nombres, b.telefono from copia b, data a;

NOMBRES              TELEFONO
-------------------- --------------------
Juan Manuel          666-7655
Juan Manuel          765-4599