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

115

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

  • 0
    Реализация имеет тенденцию варьироваться в зависимости от целевой СУБД, так на какого поставщика вы ориентируетесь?
  • 1
    это не домашнее задание ... !! Я готовлюсь к собеседованию ... Так что подумал спросить здесь ... Я попытался поискать в Google, но не нашел ни одной хорошей статьи, где я все это объяснил бы в одном ... !!
Показать ещё 3 комментария
Теги:
database-design

3 ответа

233
Лучший ответ

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

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

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

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

  • 1
    Что является хорошим примером того, когда «обратная связь» полезна в отношениях «один к одному»? Спасибо за четкий и краткий ответ.
  • 0
    @dev_feed С точки зрения дизайна базы данных, я не считаю, что обратная ссылка будет полезной, но использование приведенного выше примера обратной ссылки может упростить поиск student заданному address .
Показать ещё 12 комментариев
11

Пример немного странный для меня. Итак, у одного ученика не может быть много адресов? На самом деле это возможно. Я думаю, что пример реального мира для трех типов отношений, согласно статье, которую я написал, выглядит следующим образом:

1:1

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

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

Пример:

Create table Gov(GID number(6) primary key, 
Name varchar2(25), Address VarCHAR2(30), 
Term_begin date,Term_end Date); 


Create table State(SID number(3) primary key,
State_name varchar2(15), Population number(10),
SGID Number(4)  references GOV(GID), 
CONSTRAINT GOV_SDID UNIQUE (SGID));

insert into gov(GID, Name, Address, term_begin) 
values(110, 'Bob', '123 any st', '1-Jan-2009');

insert into state values(111, 'Virginia', 
2000000, 110);

1: M

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

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

create table vendor1 ( vendor_no    number(4) primary key,
 name varchar2(20),  address varchar2(20),  city        varchar2(15),  st varchar2(2),  zip varchar2(10),  contact  varchar2(16),  phone_no varchar2(12),  status  varchar2(8),
 stamp_date     date);

create table inventory1 ( item   varchar2(6) primary key,
 description  varchar2(30),  quantity_on_hand number(4) not null,
 vendor_no   number(2) references vendor1(vendor_no),
 reorder_qty  number(3) not null );

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

Чтобы установить отношение "Множество к многим", Создайте третью таблицу под названием "Отношение" которые будут иметь первичные ключи как таблицы A, так и B.

Create table Class (ClsID varchar2(10) primary Key, 
    title Varchar2(30),
    Instructor Varchar2(30), 
    Day Varchar2(15), 
    time Varchar2(10));

Create table Student (StudID varchar2(15) primary Key, 
    Name Varchar2(35),
    Major Varchar2(35), 
    Classyr Varchar2(10), 
    Status  Varchar2(10));  

Create table Stud_class (studid Varchar2 (15) not null,
ClsId varchar2 (14) not null,
Foreign key (Studid) references Student(Studid), 
Foreign key (ClsId) references Class(ClsID),
UNIQUE (Studid,ClsID));
  • 0
    1-й пример: номер GID (6) и номер SGID (4), почему? Разве SGID также не должен быть (6)? И на втором примере номер (4) и номер (2) ...
  • 0
    @obeliksz может быть нулем?
2

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

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

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

-- 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
)
  • 6
    Было бы лучше и понятнее, если бы вы добавили ограничения первичного и внешнего ключей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню