いくつかの例を使用してテーブルを設計するときに、1対1、1対多、および多対多の関係を実装する方法を誰かが説明できますか?
いくつかの例を使用してテーブルを設計するときに、1対1、1対多、および多対多の関係を実装する方法を誰かが説明できますか?
回答:
1対1:参照されるテーブルへの外部キーを使用します。
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
)の同じ行に関連付けられないように、外部キー列()に一意制約を設定する必要があります。
1対多:関係の多面で外部キーを使用して、「1」面にリンクします。
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
student
特定のを簡単に見つけることができaddress
ます。
student_classes
各行には、1対1の関係が1つだけ必要です。場合studentA
であるclassA
とclassB
、その後に2つの行があるはずstudent_classes
、その関係について1。
次に、関係のタイプの実際の例をいくつか示します。
テーブルAの1つのレコードがテーブルBの最大1つのレコードに関連付けられている場合に限り、関係は1対1です。
1対1の関係を確立するには、(孤立レコードのない)テーブル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);
テーブルAの1つのレコードがテーブルBの1つ以上のレコードに関連付けられている場合に限り、リレーションシップは1対多です。ただし、テーブルBの1つのレコードをテーブルAの複数のレコードに関連付けることはできません。
1対多の関係を確立するには、テーブルA(「1」のテーブル)の主キーがテーブルB(「多」のテーブル)の2次キーでなければなりません。
例えば:
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の1つのレコードがテーブルBの1つ以上のレコードに関連付けられている場合、およびその逆の場合に限り、関係は多対多です。
多対多の関係を確立するには、「ClassStudentRelation」という3番目のテーブルを作成します。このテーブルには、テーブル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)
);
これは非常に一般的な質問なので、この回答を記事に変えることにしました。
1対多のテーブルの関係は次のようになります。
リレーショナルデータベースシステムでは、1対多のテーブルリレーションシップは、親テーブル行のForeign Key
を参照する子の列に基づいて2つのテーブルをリンクしますPrimary Key
。
上記の表の図では、post_id
列post_comment
テーブルが有しているForeign Key
との関係post
テーブルID Primary Key
カラム:
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
1対1のテーブルの関係は次のようになります。
リレーショナルデータベースシステムでは、1対1のテーブルリレーションシップが、親テーブル行の参照Primary Key
でもある子の列に基づいて2つのテーブルをリンクします。Foreign Key
Primary Key
したがって、子テーブルPrimary Key
は親テーブルと共有していると言えます。
上の表の図id
では、post_details
表の列は表Foreign Key
との関係も持っていpost
ますid
Primary Key
列を:
ALTER TABLE
post_details
ADD CONSTRAINT
fk_post_details_id
FOREIGN KEY (id) REFERENCES post
多対多のテーブルの関係は次のようになります。
リレーショナルデータベースシステムでは、多対多のテーブルリレーションシップは、2つの親テーブルを、2つの Foreign Key
列を参照する列Primary Key
。
上記の表の図post_id
では、post_tag
表の列はForeign Key
、post
表ID Primary Key
列との関係も持っています。
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post
そして、tag_id
列post_tag
の表では、持っているForeign Key
との関係tag
テーブルのid Primary Key
列を:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
1対1(1-1)の関係: これは、主キーと外部キーの関係です(主キーは1つのレコードのみの外部キーに関連しています)。これは1対1の関係です。
1対多(1-M)の関係: これも主キーと外部キーの関係間の関係ですが、ここでは複数のレコードに関連する主キーがあります(つまり、表Aには書籍情報があり、表Bには1つの書籍の複数の出版社があります)。
多対多(MM):多対多には2つの次元が含まれ、サンプルを使用して以下で完全に説明されています。
-- 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
)