Alguém pode explicar como implementar relacionamentos um para um, um para muitos e muitos para muitos enquanto cria tabelas com alguns exemplos?
Alguém pode explicar como implementar relacionamentos um para um, um para muitos e muitos para muitos enquanto cria tabelas com alguns exemplos?
Respostas:
Um para um: use uma chave estrangeira para a tabela referenciada:
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
Você também deve colocar uma restrição exclusiva na coluna de chave estrangeira ( addess.student_id
) para impedir que várias linhas na tabela filha ( address
) se relacionem com a mesma linha na tabela referenciada ( student
).
Um para muitos : use uma chave estrangeira no lado muitos do relacionamento, vinculando de volta ao lado "um":
teachers: teacher_id, first_name, last_name # the "one" side
classes: class_id, class_name, teacher_id # the "many" side
Muitos para muitos : use uma tabela de junção ( exemplo ):
student: student_id, first_name, last_name
classes: class_id, name, teacher_id
student_classes: class_id, student_id # the junction table
Consultas de exemplo:
-- 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
student
dado address
.
student_classes
linha deve ter apenas um relacionamento individual. Se studentA
estiver em classA
e classB
, deve haver duas linhas student_classes
, uma para qual relacionamento.
Aqui estão alguns exemplos reais dos tipos de relacionamentos:
Um relacionamento é individual se e somente se um registro da tabela A estiver relacionado a um máximo de um registro na tabela B.
Para estabelecer um relacionamento um para um, a chave primária da tabela B (sem registro órfão) deve ser a chave secundária da tabela A (com registros órfãos).
Por exemplo:
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);
Um relacionamento é um para muitos se, e somente se, um registro da tabela A estiver relacionado a um ou mais registros na tabela B. No entanto, um registro na tabela B não pode estar relacionado a mais de um registro na tabela A.
Para estabelecer um relacionamento um para muitos, a chave primária da tabela A (a tabela "um") deve ser a chave secundária da tabela B (a tabela "muitos").
Por exemplo:
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
);
Um relacionamento é muitos para muitos se e somente se um registro da tabela A estiver relacionado a um ou mais registros na tabela B e vice-versa.
Para estabelecer um relacionamento muitos para muitos, crie uma terceira tabela chamada "ClassStudentRelation", que terá as chaves primárias da tabela A e da tabela 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)
);
Como é uma pergunta muito comum, decidi transformar essa resposta em um artigo .
O relacionamento de uma para muitas tabelas é o seguinte:
Em um sistema de banco de dados relacional, um relacionamento de tabela um para muitos vincula duas tabelas com base em uma Foreign Key
coluna no filho que faz referência à Primary Key
linha da tabela pai.
No diagrama da tabela acima, a post_id
coluna da post_comment
tabela possui um Foreign Key
relacionamento com a coluna do post
ID da tabela Primary Key
:
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
O relacionamento da tabela um para um é o seguinte:
Em um sistema de banco de dados relacional, um relacionamento de tabela um para um vincula duas tabelas com base em uma Primary Key
coluna no filho, que também é uma Foreign Key
referência à Primary Key
linha da tabela pai.
Portanto, podemos dizer que a tabela filha compartilha a Primary Key
com a tabela pai.
No diagrama da tabela acima, a id
coluna da post_details
tabela também possui um Foreign Key
relacionamento com a coluna da post
tabela id
Primary Key
:
ALTER TABLE
post_details
ADD CONSTRAINT
fk_post_details_id
FOREIGN KEY (id) REFERENCES post
O relacionamento de tabela muitos para muitos é o seguinte:
Em um sistema de banco de dados relacional, um relacionamento de tabela muitos para muitos vincula duas tabelas pai por meio de uma tabela filha que contém duas Foreign Key
colunas referenciando as Primary Key
colunas das duas tabelas pai.
No diagrama da tabela acima, a post_id
coluna da post_tag
tabela também possui um Foreign Key
relacionamento com a coluna do post
ID da tabela Primary Key
:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post
E, a tag_id
coluna na post_tag
tabela possui um Foreign Key
relacionamento com a coluna de tag
identificação da tabela Primary Key
:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
Relação um a um (1-1): é a relação entre chave primária e chave estrangeira (chave primária relacionada à chave estrangeira apenas um registro). esse é um relacionamento individual.
Relacionamento um para muitos (1-M): também é um relacionamento entre relacionamentos de chaves primárias e estrangeiras, mas aqui a chave primária relacionada a vários registros (por exemplo, a Tabela A possui informações sobre o livro e a Tabela B possui vários editores de um livro).
Muitos para muitos (MM): muitos para muitos inclui duas dimensões, explicadas completamente como abaixo com a amostra.
-- 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
)