¿Cómo implementar relaciones uno a uno, uno a muchos y muchos a muchos al diseñar tablas?

Resuelto arsenal asked hace 13 años • 4 respuestas

¿Alguien puede explicar cómo implementar relaciones uno a uno, uno a muchos y muchos a muchos mientras se diseñan tablas con algunos ejemplos?

arsenal avatar Sep 04 '11 08:09 arsenal
Aceptado

Uno a uno: utilice una clave externa para la tabla a la que se hace referencia:

student: student_id, first_name, last_name, address_id
address: address_id, address, city, zipcode, student_id # you can have a
                                                        # "link back" if you need

También debe poner una restricción única en la columna de clave externa ( addess.student_id) para evitar que varias filas en la tabla secundaria ( address) se relacionen con la misma fila en la tabla a la que se hace referencia ( student).

Uno a muchos : utilice una clave externa en el lado muchos de la relación que enlaza con el lado "uno":

teachers: teacher_id, first_name, last_name # the "one" side
classes:  class_id, class_name, teacher_id  # the "many" side

Muchos a muchos : utilice una tabla de unión ( ejemplo ):

student: student_id, first_name, last_name
classes: class_id, name, teacher_id
student_classes: class_id, student_id     # the junction table

Consultas de ejemplo:

 -- Getting all students for a class:

    SELECT s.student_id, last_name
      FROM student_classes sc 
INNER JOIN students s ON s.student_id = sc.student_id
     WHERE sc.class_id = X

 -- Getting all classes for a student: 

    SELECT c.class_id, name
      FROM student_classes sc 
INNER JOIN classes c ON c.class_id = sc.class_id
     WHERE sc.student_id = Y

NullUserException avatar Sep 04 '2011 01:09 NullUserException

A continuación se muestran algunos ejemplos del mundo real de los tipos de relaciones:

Uno a uno (1:1)

Una relación es uno a uno si y sólo si un registro de la tabla A está relacionado con un máximo de un registro en la tabla B.

Para establecer una relación uno a uno, la clave principal de la tabla B (sin registros huérfanos) debe ser la clave secundaria de la tabla A (con registros huérfanos).

Por ejemplo:

CREATE TABLE Gov(
    GID number(6) PRIMARY KEY, 
    Name varchar2(25), 
    Address varchar2(30), 
    TermBegin date,
    TermEnd date
); 

CREATE TABLE State(
    SID number(3) PRIMARY KEY,
    StateName varchar2(15),
    Population number(10),
    SGID Number(4) REFERENCES Gov(GID), 
    CONSTRAINT GOV_SDID UNIQUE (SGID)
);

INSERT INTO gov(GID, Name, Address, TermBegin) 
values(110, 'Bob', '123 Any St', '1-Jan-2009');

INSERT INTO STATE values(111, 'Virginia', 2000000, 110);

Uno a muchos (1:M)

Una relación es de uno a muchos si y sólo si un registro de la tabla A está relacionado con uno o más registros de la tabla B. Sin embargo, un registro de la tabla B no puede estar relacionado con más de un registro de la tabla A.

Para establecer una relación de uno a muchos, la clave principal de la tabla A (la tabla "uno") debe ser la clave secundaria de la tabla B (la tabla "muchos").

Por ejemplo:

CREATE TABLE Vendor(
    VendorNumber number(4) PRIMARY KEY,
    Name varchar2(20),
    Address varchar2(20),
    City varchar2(15),
    Street varchar2(2),
    ZipCode varchar2(10),
    Contact varchar2(16),
    PhoneNumber varchar2(12),
    Status varchar2(8),
    StampDate date
);

CREATE TABLE Inventory(
    Item varchar2(6) PRIMARY KEY,
    Description varchar2(30),
    CurrentQuantity number(4) NOT NULL,
    VendorNumber number(2) REFERENCES Vendor(VendorNumber),
    ReorderQuantity number(3) NOT NULL
);

Muchos a muchos (M:M)

Una relación es de muchos a muchos si y sólo si un registro de la tabla A está relacionado con uno o más registros de la tabla B y viceversa.

Para establecer una relación de muchos a muchos, cree una tercera tabla llamada "ClassStudentRelation" que tendrá las claves principales tanto de la tabla A como de la tabla B.

CREATE TABLE Class(
    ClassID varchar2(10) PRIMARY KEY, 
    Title varchar2(30),
    Instructor varchar2(30), 
    Day varchar2(15), 
    Time varchar2(10)
);

CREATE TABLE Student(
    StudentID varchar2(15) PRIMARY KEY, 
    Name varchar2(35),
    Major varchar2(35), 
    ClassYear varchar2(10), 
    Status varchar2(10)
);  

CREATE TABLE ClassStudentRelation(
    StudentID varchar2(15) NOT NULL,
    ClassID varchar2(14) NOT NULL,
    FOREIGN KEY (StudentID) REFERENCES Student(StudentID), 
    FOREIGN KEY (ClassID) REFERENCES Class(ClassID),
    UNIQUE (StudentID, ClassID)
);
Arabinda Banik avatar Apr 14 '2016 18:04 Arabinda Banik

Uno a muchos

La relación de tabla de uno a muchos tiene el siguiente aspecto:

Uno a muchos

En un sistema de base de datos relacional, una relación de tabla de uno a muchos vincula dos tablas en función de una Foreign Keycolumna del elemento secundario que hace referencia a la Primary Keyfila de la tabla principal.

En el diagrama de tabla anterior, la post_idcolumna de la post_commenttabla tiene una Foreign Keyrelación con la columna postde identificación de la tabla :Primary Key

ALTER TABLE
    post_comment
ADD CONSTRAINT
    fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post

Cara a cara

La relación de tabla uno a uno tiene el siguiente aspecto:

Cara a cara

En un sistema de base de datos relacional, una relación de tabla uno a uno vincula dos tablas en función de una Primary Keycolumna en la columna secundaria que también hace Foreign Keyreferencia a Primary Keyla fila de la tabla principal.

Por lo tanto, podemos decir que la tabla secundaria comparte Primary Keycon la tabla principal.

En el diagrama de tabla anterior, la idcolumna de la post_detailstabla también tiene una Foreign Keyrelación con la columna postde la tabla :id Primary Key

ALTER TABLE
    post_details
ADD CONSTRAINT
    fk_post_details_id
FOREIGN KEY (id) REFERENCES post

Muchos a muchos

La relación de la tabla de muchos a muchos tiene el siguiente aspecto:

Muchos a muchos

En un sistema de base de datos relacional, una relación de tablas de muchos a muchos vincula dos tablas principales a través de una tabla secundaria que contiene dos Foreign Keycolumnas que hacen referencia a las Primary Keycolumnas de las dos tablas principales.

En el diagrama de tabla anterior, la post_idcolumna de la post_tagtabla también tiene una Foreign Keyrelación con la columna postde identificación de la tabla :Primary Key

ALTER TABLE
    post_tag
ADD CONSTRAINT
    fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post

Y la tag_idcolumna de la post_tagtabla tiene una Foreign Keyrelación con la columna tagde identificación de la tabla :Primary Key

ALTER TABLE
    post_tag
ADD CONSTRAINT
    fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
Vlad Mihalcea avatar Mar 02 '2020 19:03 Vlad Mihalcea