Как реализовать отношения один-к-одному, один-ко-многим и многие-ко-многим при разработке таблиц? - PullRequest
213 голосов
/ 04 сентября 2011

Может кто-нибудь объяснить, как реализовать отношения один-к-одному, один-ко-многим и многие-ко-многим при разработке таблиц с некоторыми примерами?

Ответы [ 3 ]

386 голосов
/ 04 сентября 2011

Один-к-одному: Использование внешнего ключа для ссылочной таблицы:

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

Необходимо также наложить уникальное ограничение на столбец внешнего ключа (addess.student_id)для предотвращения связи нескольких строк в дочерней таблице (address) с одной и той же строкой в ​​ссылочной таблице (student).

Один-ко-многим : использование внешнегоключ на многогранной связи, связывающей обратно со стороной «один»:

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

«многие ко многим» : использовать таблицу соединений ( пример ):

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

Примеры запросов:

 -- 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

50 голосов
/ 14 апреля 2016

Вот некоторые реальные примеры типов отношений:

Один-к-одному (1: 1)

Отношение является взаимно-однозначным, если и только если одна запись из таблицы A связана максимум с одной записью в таблице B.

Чтобы установить взаимно-однозначное отношение, первичный ключ таблицы B (без записи о потерях) должен быть вторичным ключом таблицы A (с записями о потерях).

Например:

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);

Один ко многим (1: M)

Отношение один-ко-многим, если и только если одна запись из таблицы A относится к одной или нескольким записям в таблице B. Однако одна запись в таблице B не может быть связана с несколькими записями в таблице A.

Чтобы установить отношение «один ко многим», первичный ключ таблицы A (таблица «one») должен быть вторичным ключом таблицы B (таблица «many»).

Например:

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
);

Многие ко многим (М: М)

Отношение много-ко-многим тогда и только тогда, когда одна запись из таблицы A связана с одной или несколькими записями в таблице B и наоборот.

Чтобы установить отношение «многие ко многим», создайте третью таблицу с именем «ClassStudentRelation», которая будет иметь первичные ключи как таблицы A, так и таблицы 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)
);
3 голосов
/ 16 мая 2016

Отношение один к одному (1-1): Это связь между первичным и внешним ключом (первичный ключ относится только к одной записи внешнего ключа). это отношения один на один.

Отношение один-ко-многим (1-M): Это также отношения между отношениями первичного и внешнего ключей, но здесь первичный ключ относится к нескольким записям (т. Е. В таблице A содержится информация о книге, а в таблице B - несколько издателей одной книги).

Многие ко многим (М-М): Многие ко многим включают два измерения, полностью объясненные, как показано ниже, с образцом.

-- This table will hold our phone calls.
CREATE TABLE dbo.PhoneCalls
(
   ID INT IDENTITY(1, 1) NOT NULL,
   CallTime DATETIME NOT NULL DEFAULT GETDATE(),
   CallerPhoneNumber CHAR(10) NOT NULL
)
-- This table will hold our "tickets" (or cases).
CREATE TABLE dbo.Tickets
(
   ID INT IDENTITY(1, 1) NOT NULL,
   CreatedTime DATETIME NOT NULL DEFAULT GETDATE(),
   Subject VARCHAR(250) NOT NULL,
   Notes VARCHAR(8000) NOT NULL,
   Completed BIT NOT NULL DEFAULT 0
)
-- This table will link a phone call with a ticket.
CREATE TABLE dbo.PhoneCalls_Tickets
(
   PhoneCallID INT NOT NULL,
   TicketID INT NOT NULL
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...