Hubungan antara Tabel Database

1. Perkenalan


Komunikasi adalah topik yang agak penting yang harus dipahami ketika merancang basis data. Dari pengalaman pribadi saya, saya akan mengatakan bahwa, setelah menyadari koneksi, jauh lebih mudah bagi saya untuk memahami normalisasi database.

1.1. Untuk siapa artikel ini?


Artikel ini akan bermanfaat bagi mereka yang ingin memahami hubungan antara tabel database. Di dalamnya, saya mencoba mengatakan dengan bahasa sederhana apa itu. Untuk pemahaman yang lebih baik tentang topik, saya mengganti bahan teoretis dengan contoh-contoh praktis yang disajikan dalam bentuk diagram dan kueri yang menciptakan tabel yang kita butuhkan. Saya menggunakan Microsoft SQL Server DBMS dan saya menulis kueri dalam T-SQL. Kode yang saya tulis harus bekerja pada DBMS lain, karena kueri bersifat universal dan tidak menggunakan konstruksi T-SQL tertentu.

1.2. Bagaimana Anda bisa menerapkan pengetahuan ini?


  1. Proses membuat basis data akan menjadi lebih mudah dan lebih mudah dipahami untuk Anda.
  2. Memahami hubungan antar tabel akan membantu Anda untuk lebih memahami normalisasi, yang sangat penting saat mendesain database.
  3. Berurusan dengan basis data asing akan jauh lebih mudah.
  4. Saat wawancara, ini akan menjadi nilai tambah yang sangat baik.

2. Ucapan Terima Kasih


Saran dan kritik dari penulis dipertimbangkan. jobgemws, tidak terisi, firnind, Hamaruba.
Terima kasih!

3.1. Bagaimana komunikasi diatur?


Tautan dibuat menggunakan kunci asing.
Kunci asing adalah atribut atau set atribut yang merujuk kunci primer atau unik dari tabel lain. Dengan kata lain, itu adalah sesuatu seperti penunjuk ke baris di tabel lain.

3.2. Jenis-jenis Hubungan


Tautan dibagi menjadi:

  1. Banyak ke banyak.
  2. Satu ke banyak.
    • dengan koneksi wajib;
    • dengan komunikasi opsional;
  3. Satu lawan satu.
    • dengan koneksi wajib;
    • dengan komunikasi opsional;

Mari kita perhatikan secara terperinci masing-masing.

4. Banyak ke banyak


Bayangkan kita perlu menulis database yang akan disimpan oleh karyawan perusahaan IT. Pada saat yang sama, ada satu set posting standar tertentu. Di mana:

  • Seorang karyawan mungkin memiliki satu posting atau lebih. Misalnya, karyawan tertentu dapat menjadi administrator dan pemrogram.
  • Suatu posisi dapat "memiliki" satu atau lebih karyawan. Misalnya, admin adalah sekumpulan pekerja tertentu. Dengan kata lain, beberapa pekerja milik admin.

Karyawan diwakili oleh tabel Karyawan (id, nama, usia), posisi diwakili oleh tabel Posisi (id dan nama posisi). Seperti yang Anda lihat, kedua tabel ini terhubung sesuai dengan aturan banyak-ke-banyak: setiap karyawan memiliki satu posisi atau lebih (banyak posisi), setiap posisi memiliki satu atau lebih karyawan (banyak karyawan).

4.1. Bagaimana cara membuat tabel seperti itu?


Kami sudah memiliki dua tabel yang menggambarkan karyawan dan profesi. Sekarang kita perlu menjalin hubungan banyak ke banyak di antara mereka. Untuk mengimplementasikan hubungan seperti itu, kita perlu semacam perantara antara tabel "Karyawan" dan "Posisi". Dalam kasus kami, itu akan menjadi tabel tertentu "Posisi Karyawan" (pekerja dan posisi). Tabel mediasi ini menghubungkan karyawan dan posisi sebagai berikut:
Identitas pegawaiPosisiId
11
12
23
33
Di sebelah kiri adalah karyawan (id mereka), di sebelah kanan adalah posisi (id mereka). Karyawan dan posisi di tabel ini ditunjukkan menggunakan id'shniki.

Tabel ini dapat dilihat dari dua sisi:

  1. Dengan demikian, kita mengatakan bahwa karyawan dengan id 1 berada di posisi dengan id 1. Pada saat yang sama, perhatikan fakta bahwa dalam tabel ini karyawan dengan id 1 memiliki dua posisi: 1 dan 2. Artinya, setiap karyawan di sebelah kiri sesuai dengan posisi tertentu di sebelah kanan.
  2. Kita juga dapat mengatakan bahwa posting dengan id 3 milik pengguna dengan id 2 dan 3. Artinya, setiap karyawan di sebelah kanan memiliki karyawan tertentu di sebelah kiri.

4.2. Penerapan


Diagram


Kode T-SQL
create table dbo.Employee
(
	EmployeeId int primary key,
	EmployeeName nvarchar(128) not null,
	EmployeeAge int not null
)

--   Employee .
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (1, N'John Smith', 22)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (2, N'Hilary White', 22)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (3, N'Emily Brown', 22)

create table dbo.Position
(
	PositionId int primary key,
	PositionName nvarchar(64) not null
)

--   Position .
insert into dbo.Position(PositionId, PositionName) values(1, N'IT-director')
insert into dbo.Position(PositionId, PositionName) values(2, N'Programmer')
insert into dbo.Position(PositionId, PositionName) values(3, N'Engineer')

--   EmployeesPositions .
create table dbo.EmployeesPositions
(
	PositionId int foreign key references dbo.Position(PositionId),
	EmployeeId int foreign key references dbo.Employee(EmployeeId),
	primary key(PositionId, EmployeeId)
)

insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (1, 1)
insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (1, 2)
insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (2, 3)
insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (3, 3)


Penjelasan
foreign key primary key unique .

  • PositionId EmployeesPositions PositionId Position;
  • EmployeeId EmployeesPositions β€” EmployeeId Employee;


4.3. Kesimpulan


Untuk menerapkan banyak-ke-banyak hubungan, kita membutuhkan mediator antara dua tabel yang sedang dipertimbangkan. Itu harus menyimpan dua kunci asing, yang pertama mengacu pada tabel pertama, dan yang kedua ke yang kedua.

5. Satu ke banyak


Ini adalah koneksi yang paling umum di antara basis data. Kami mempertimbangkannya setelah menghubungkan banyak ke banyak untuk perbandingan.

Misalkan kita perlu mengimplementasikan database tertentu yang merekam data pengguna. Pengguna memiliki: nama, nama keluarga, usia, nomor telepon. Selain itu, setiap pengguna dapat memiliki satu atau lebih nomor telepon (banyak nomor telepon).

Dalam hal ini, kami mengamati hal-hal berikut: pengguna dapat memiliki banyak nomor telepon, tetapi tidak dapat dikatakan bahwa pengguna tertentu milik nomor telepon tersebut.

Dengan kata lain, telepon hanya milik satu pengguna. Seorang pengguna dapat memiliki 1 atau lebih telepon (banyak).

Seperti yang bisa kita lihat, hubungan ini adalah hubungan satu ke banyak.

5.1. Bagaimana cara membuat tabel seperti itu?


Pengguna akan diwakili oleh tabel β€œOrang” tertentu (id, nama depan, nama belakang, umur), nomor telepon akan diwakili oleh tabel β€œTelepon”. Ini akan terlihat seperti ini:
PhoneIdKepribadianNomor telepon
1511 091-10
2519 124-66
31721 972-02
Tabel ini mewakili tiga nomor telepon. Dalam hal ini, nomor telepon dengan id 1 dan 2 milik pengguna dengan id 5. Tetapi nomor dengan id 3 milik pengguna dengan id 17.
Catatan . Jika tabel "Telepon" memiliki lebih banyak atribut, kami akan dengan aman menambahkannya ke tabel ini.

5.2. Mengapa kita tidak melakukan tabel perantara di sini?


Tabel perantara hanya diperlukan jika kita memiliki hubungan banyak-ke-banyak. Untuk alasan sederhana yang bisa kita pertimbangkan dari dua sisi. Seperti tabel Posisi Karyawan sebelumnya:

  1. Setiap karyawan memiliki beberapa posisi (banyak).
  2. Setiap posisi dimiliki oleh beberapa karyawan (banyak).

Namun dalam kasus kami, kami tidak dapat mengatakan bahwa setiap telepon memiliki beberapa pengguna - hanya satu pengguna yang dapat memiliki nomor telepon.
Sekarang baca kembali catatan di akhir paragraf 5.1. - itu akan menjadi lebih dimengerti untukmu.

5.3. Penerapan


Diagram


Kode T-SQL
create table dbo.Person
(
	PersonId int primary key,
	FirstName nvarchar(64) not null,
	LastName nvarchar(64) not null,
	PersonAge int not null
)

insert into dbo.Person(PersonId, FirstName, LastName, PersonAge) values (5, N'John', N'Doe', 25)
insert into dbo.Person(PersonId, FirstName, LastName, PersonAge) values (17, N'Izabella', N'MacMillan', 19)

create table dbo.Phone
(
	PhoneId int primary key,
	PersonId int foreign key references dbo.Person(PersonId),
	PhoneNumber varchar(64) not null
)

insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (1, 5, '11 091-10')
insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (2, 5, '19 124-66')
insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (3, 17, '21 972-02')


Penjelasan
Phone . ( Person). , : Β« Β». , id .

6. Satu lawan satu


Bayangkan di tempat kerja Anda diberi tugas untuk menulis database untuk mencatat semua karyawan untuk HR. Bos meyakinkan bahwa perusahaan hanya perlu tahu tentang nama, umur, dan nomor telepon karyawan. Anda mengembangkan database seperti itu dan menempatkan di dalamnya semua 1000 karyawan perusahaan. Dan kemudian bos mengatakan bahwa karena alasan tertentu mereka perlu tahu tentang apakah karyawan itu cacat atau tidak. Hal paling sederhana yang terlintas dalam pikiran adalah menambahkan kolom bool baru ke meja Anda. Tetapi terlalu lama untuk memasukkan 1000 nilai dan benar Anda akan memasukkan jauh lebih jarang daripada salah (2% akan benar, misalnya).

Solusi yang lebih mudah adalah membuat tabel baru, sebut saja "DisabledEmployee". Ini akan terlihat seperti ini:
DisabledPersonIdIdentitas pegawai
1159
2722
3937
Tapi ini bukan hubungan satu-ke-satu. Faktanya adalah bahwa dalam tabel seperti itu seorang karyawan dapat dimasukkan lebih dari sekali, masing-masing, kami mendapat hubungan satu-ke-banyak: seorang karyawan dapat dinonaktifkan beberapa kali. Penting untuk memastikan bahwa karyawan dapat dimasukkan ke dalam tabel hanya sekali, masing-masing, dapat dinonaktifkan hanya sekali. Untuk melakukan ini, kami perlu menunjukkan bahwa kolom EmployeeId hanya dapat menyimpan nilai unik. Kita hanya perlu memaksakan batasan unik pada kolom EmloyeeId. Pembatasan ini melaporkan bahwa suatu atribut hanya dapat mengambil nilai unik.

Dengan melakukan ini, kami mendapat hubungan satu-ke-satu.

Catatan. Perhatikan bahwa kami juga dapat menerapkan batasan kunci primer pada atribut EmloyeeId. Ini berbeda dari batasan unik hanya karena tidak boleh nol.

6.1. Kesimpulan


Kita dapat mengatakan bahwa hubungan satu-ke-satu adalah pembagian dari tabel yang sama menjadi dua.

6.2. Penerapan


Diagram


Kode T-SQL
create table dbo.Employee
(
	EmployeeId int primary key,
	EmployeeName nvarchar(128) not null,
	EmployeeAge int not null
)

insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (159, N'John Smith', 22)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (722, N'Hilary White', 29)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (937, N'Emily Brown', 19)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (100, N'Frederic Miller', 16)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (99, N'Henry Lorens', 20)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (189, N'Bob Red', 25)

create table dbo.DisabledEmployee
(
	DisabledPersonId int primary key,
	EmployeeId int unique foreign key references dbo.Employee(EmployeeId)
)

insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (1, 159)
insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (2, 722)
insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (3, 937)


Penjelasan
DisabledEmployee EmployeeId, . EmployeeId Employee. , unique, , . , .

7. Komunikasi wajib dan opsional


Hubungan dapat dibagi menjadi wajib dan opsional.

7.1. Satu ke banyak


  1. Satu ke banyak orang dengan koneksi wajib:
    Banyak prajurit milik satu resimen. Satu pejuang hanya milik satu resimen. Harap dicatat bahwa prajurit mana pun harus milik satu resimen, dan resimen tidak dapat ada tanpa tentara.
  2. Satu ke banyak dengan koneksi opsional:
    Semua orang hidup di planet Bumi. Setiap orang hanya hidup di Bumi. Terlebih lagi, sebuah planet bisa ada tanpa manusia. Karenanya, menemukan kita di Bumi adalah opsional

Hubungan yang sama dapat dianggap wajib dan opsional. Pertimbangkan contoh ini:
Seorang ibu biologis dapat memiliki banyak anak. Seorang anak hanya memiliki satu ibu kandung.
A) Seorang wanita tidak harus memiliki anak sendiri. Dengan demikian, komunikasi bersifat opsional.
B) Anak tentu hanya memiliki satu ibu kandung - dalam hal ini, komunikasi diperlukan.

7.2. Satu lawan satu


  1. Satu ke satu dengan koneksi wajib:
    Satu warga negara dari negara tertentu harus hanya memiliki satu paspor negara itu. Satu paspor hanya memiliki satu pemegang.
  2. Satu ke satu dengan tautan opsional:
    Satu negara hanya dapat memiliki satu konstitusi. Satu konstitusi hanya milik satu negara. Namun konstitusi tidak mengikat. Suatu negara mungkin atau mungkin tidak memilikinya, seperti, misalnya, Israel dan Inggris Raya.

Koneksi yang sama dapat dianggap wajib dan opsional:
Satu orang hanya dapat memiliki satu paspor. Satu paspor hanya memiliki satu pemilik.
A) Kehadiran paspor adalah opsional - warga negara mungkin tidak memilikinya. Ini adalah tautan opsional.
B) Paspor harus hanya memiliki satu pemilik. Dalam hal ini, ini sudah merupakan koneksi wajib.

7.3. Banyak ke banyak


Hubungan banyak ke banyak adalah opsional. Contohnya:
Seseorang dapat berinvestasi dalam saham perusahaan yang berbeda (banyak). Beberapa investor perusahaan adalah orang-orang tertentu (banyak).
A) Seseorang mungkin tidak menginvestasikan uangnya di saham sama sekali.
B) Tidak ada yang bisa membeli saham perusahaan.

8. Bagaimana cara membaca grafik?


Di atas, saya memberikan diagram dari tabel yang kami buat. Tetapi untuk memahami mereka, Anda perlu tahu cara "membacanya". Kami akan memahami ini dengan menggunakan contoh diagram dari paragraf 5.3.



Kami melihat hubungan satu-ke-banyak. Satu orang memiliki banyak telepon.

  1. Dekat meja Orang adalah kunci emas. Ini menunjukkan kata "satu."
  2. Dekat meja Telepon adalah tanda tak terhingga. Ini menunjukkan kata "banyak."

9. Ringkasan


  1. Koneksi adalah:
    • Banyak ke banyak.
    • Satu ke banyak.
      1) dengan komunikasi wajib;
      2) dengan tautan opsional.
    • Satu lawan satu.
      1) dengan komunikasi wajib;
      2) dengan tautan opsional.
  2. Koneksi diatur menggunakan kunci asing.
  3. Kunci asing adalah atribut atau set atribut yang merujuk kunci primer atau unik dari tabel lain. Dengan kata lain, itu adalah sesuatu seperti penunjuk ke baris di tabel lain.

10. Tujuan


Untuk asimilasi materi yang lebih baik, saya sarankan Anda memecahkan masalah berikut:

  1. : id, , , , . , , , .
  2. : id, , , . , .
  3. : , , ,
    • : id, , .
    • : id, .

    , β€” . , .
  4. 6.2. - , DisabledEmployee.

All Articles