PostgreSQL - Como hacer base de datos con relación muchos a muchos

 
Vista:
sin imagen de perfil

Como hacer base de datos con relación muchos a muchos

Publicado por Luis Felipe (1 intervención) el 14/03/2016 21:22:52
Hola amigos,

Estoy trabajando con una base de datos que tiene dos tablas por un lado usuarios y la otra es documentos.

En usuarios tengo toda la información de estos con su respectivo idusuario (clave primaria) y en documentos tengo la información de los archivos que se guardan en la base de datos (pdf, .txt, etc.) con su respectiva clave primaria id_documento. La relación es muchos a muchos porque un usuario puede tener uno o mas documentos y un documento puede pertenecer a uno o mas usuarios.

Tengo entendido que cuando es una relacion de este tipo lo mas recomendable es crear una tabla entre estas para convertir las relaciones 1:N Y N:1

Es ahí cuando creo la tabla usuariosdocumentos esta debe tener idusuario y id_documento. Mi pregunta es como mediante el código sql puedo crear esta tabla y poner las respectivas relaciones las primary key y las foreing key no se como hacerlo.

Agradezco de ante mano la ayuda de todos y pues me extiendo en la explicación para hacer que se entienda bien el problema.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Julio

Como hacer base de datos con relación muchos a muchos

Publicado por Julio (6 intervenciones) el 28/03/2016 18:06:27
Hola Luis Felipe.


Aquí te dejo un enlace a un ejemplo de desarrollo de un proyecto de base de datos con PostgreSQL donde se explican este y otro tipos de relaciones entre tablas: http://codigoxules.org/tutorial-postgresql-2-creacion-de-las-tablas-en-sql/, te indico el enlace de la segunda publicación del tutorial.

Te copio aquí un ejemplo de relaciones de la tabla de países cb_country con relación 1:N con cb_currency y cb_language.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
CREATE TABLE cb_country
(
  idcountry serial NOT NULL,
  country character varying(100) NOT NULL,
  description character varying(255),
  countrycode character(2) NOT NULL,
  hasregion character(1) NOT NULL DEFAULT 'N'::bpchar,
  regionname character varying(60),
  expressionphone character varying(20),
  displaysequence character varying(20) NOT NULL,
  isdefault character(1) DEFAULT 'N'::bpchar,
  ibannodigits numeric,
  ibancountry character varying(2),
  isactive boolean NOT NULL DEFAULT true,
  idlanguage character varying(6),
  idcurrency integer,
  CONSTRAINT pk_cb_country PRIMARY KEY (idcountry),
  CONSTRAINT fk_cb_country_idcurrency FOREIGN KEY (idcurrency)
      REFERENCES cb_currency (idcurrency) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_cb_country_idlanguage FOREIGN KEY (idlanguage)
      REFERENCES cb_language (idlanguage) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT un_cb_country_countrycode UNIQUE (countrycode),
  CONSTRAINT ch_cb_country_hasregion_check CHECK (hasregion = ANY (ARRAY['Y'::bpchar, 'N'::bpchar])),
  CONSTRAINT ch_cb_country_isdefault_check CHECK (isdefault = ANY (ARRAY['Y'::bpchar, 'N'::bpchar]))
)
WITH (
  OIDS=TRUE
);
ALTER TABLE cb_country  OWNER TO xulescode;
COMMENT ON TABLE cb_country
IS 'Tabla donde se definen todos los países con sus características principales: idioma, nombre, ..., y diferentes datos íntrinsecos a cada país.';

Usamos idcountry como clave primaria: CONSTRAINT pk_cb_country PRIMARY KEY (idcountry), en este caso también definimos como clave única countrycode, es decir, que este valor no se puede repetir, para ellos utilizamos: CONSTRAINT un_cb_country_countrycode UNIQUE. En este caso para los países definimos el idioma y la moneda para eso lo vamos a relacionar con las tablas correspondientes de cb_language y cb_currency, para esto vamos a definir las claves foráneas (foreign key) correspondientes:

Definimos la clave foránea para cb_currency, que consiste en relacionar el valor de una tabla con otra estableciendo la relación, en este caso por el id de la tabla:

1
2
3
CONSTRAINT fk_cb_country_idcurrency [Nombre de la tabla] FOREIGN KEY (idcurrency) [Campo en cb_country])
    REFERENCES cb_currency (idcurrency) [Tabla relacionada y el campo] MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE NO ACTION [Definición de las acciones]
Definimos la clave foránea para cb_language, que consiste en relacionar el valor de una tabla con otra estableciendo la relación, en este caso por el id de la tabla:
1
2
3
CONSTRAINT fk_cb_country_idlanguage [Nombre de la tabla] FOREIGN KEY (idlanguage) [Campo en cb_country])
    REFERENCES cb_language (idlanguage) [Tabla relacionada y el campo] MATCH SIMPLE
    ON UPDATE NO ACTION ON DELETE NO ACTION [Definición de las acciones]


Espero que sea esto lo que buscabas.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar