Herkes bazı örneklerle tablolar tasarlarken bire bir, bire çok ve çoktan çoğa ilişkilerin nasıl uygulanacağını açıklayabilir mi?
Herkes bazı örneklerle tablolar tasarlarken bire bir, bire çok ve çoktan çoğa ilişkilerin nasıl uygulanacağını açıklayabilir mi?
Yanıtlar:
Bire bir: Başvurulan tabloya yabancı anahtar kullanın:
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
Ayrıca addess.student_id
, alt tablodaki ( address
) birden çok satırın başvurulan tablodaki ( student
) aynı satırla ilişkilendirilmesini önlemek için yabancı anahtar sütununa ( ) benzersiz bir kısıtlama koymanız gerekir .
Bire çok : İlişkinin birçok tarafında "bir" tarafa bağlanan bir yabancı anahtar kullanın:
teachers: teacher_id, first_name, last_name # the "one" side
classes: class_id, class_name, teacher_id # the "many" side
Çoktan çoğa : Bir bağlantı tablosu kullanın ( örnek ):
student: student_id, first_name, last_name
classes: class_id, name, teacher_id
student_classes: class_id, student_id # the junction table
Örnek sorgular:
-- 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
verilen bir address
.
student_classes
satırın yalnızca bire bir ilişkisi olmalıdır. İçinde ve varsa studentA
, iki satır olmalı , biri ilişki için. classA
classB
student_classes
İlişki türlerinin bazı gerçek dünya örnekleri:
Bir ilişki, ancak tablo A'daki bir kayıt tablo B'deki en fazla bir kayıtla ilgiliyse bire birdir.
Bire bir ilişki kurmak için, B tablosunun birincil anahtarı (yetim kaydı olmadan) A tablosunun (yetim kayıtları ile) ikincil anahtarı olmalıdır.
Örneğin:
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);
Bir ilişki, ancak tablo A'daki bir kayıt tablo B'deki bir veya daha fazla kayıtla ilişkiliyse bire çok olur. Ancak, tablo B'deki bir kayıt tablo A'daki birden fazla kayıtla ilişkilendirilemez.
Bir-çok ilişkisi oluşturmak için A tablosunun birincil anahtarı ("bir" tablo) B tablosunun ikincil anahtarı ("çok" tablosu) olmalıdır.
Örneğin:
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
);
Bir ilişki, yalnızca tablo A'daki bir kayıt tablo B'deki bir veya daha fazla kayıtla ilişkiliyse ve bunun tersi olduğunda çoktan çoğa ilişkilidir.
Çoktan çoğa ilişki kurmak için, hem A tablosunun hem de B tablosunun birincil anahtarlarına sahip olacak "ClassStudentRelation" adlı üçüncü bir tablo oluşturun.
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)
);
Bu çok yaygın bir soru, bu yüzden bu cevabı bir makaleye dönüştürmeye karar verdim .
Bir-çok tablo ilişkisi aşağıdaki gibi görünür:
İlişkisel veritabanı sisteminde, bire çok tablo ilişkisi , alt tablodaki üst tablo satırına Foreign Key
başvuruda bulunan sütunu temel alan iki tabloyu birbirine bağlar Primary Key
.
Yukarıdaki tablo diyagramda, post_id
sütun post_comment
tablo bir sahiptir Foreign Key
ilişki post
tablosu id Primary Key
sütun:
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
Bire bir tablo ilişkisi aşağıdaki gibidir:
İlişkisel veritabanı sisteminde, bire bir tablo ilişkisi , alt tablodaki ana tablo satırına Primary Key
da Foreign Key
başvuran bir sütunu temel alan iki tabloyu birbirine bağlar Primary Key
.
Bu nedenle, alt tablonun Primary Key
ana tabloyla paylaştığını söyleyebiliriz .
Yukarıdaki tablo diyagramda, id
sütun post_details
tablo da var Foreign Key
olan ilişkiyi post
tablo id
Primary Key
sütun:
ALTER TABLE
post_details
ADD CONSTRAINT
fk_post_details_id
FOREIGN KEY (id) REFERENCES post
Çoktan çoğa tablo ilişkisi şöyle görünür:
İlişkisel veritabanı sisteminde, çoktan çoğa tablo ilişkisi , iki üst tabloyu, iki üst tablodaki Foreign Key
sütunlara başvuran iki sütun içeren bir alt tablo aracılığıyla bağlar Primary Key
.
Yukarıdaki tablo diyagramda, post_id
sütun post_tag
tablo da var Foreign Key
olan ilişkiyi post
tablo id Primary Key
sütun:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post
Ve, tag_id
sütun post_tag
tabloda bir sahip Foreign Key
ile ilişki tag
tablo id Primary Key
sütununun:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
Bire bir (1-1) ilişki: Bu, birincil ve yabancı anahtar (yabancı anahtarla ilgili birincil anahtar yalnızca bir kayıt) arasındaki ilişkidir. bu birebir ilişkidir.
Bire Çok (1-M) ilişki: Bu aynı zamanda birincil ve yabancı anahtar ilişkileri arasındaki ilişkidir, ancak burada birden fazla kayıtla ilgili birincil anahtar (yani Tablo A'da kitap bilgisi vardır ve Tablo B'de bir kitabın birden çok yayıncısı vardır).
Çoktan Çoğa (MM): Çoktan çoğa, aşağıdaki örnekle tam olarak açıklanan iki boyut içerir.
-- 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
)