Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL:Memahami tabel pemetaan

Saat menggunakan hubungan banyak ke banyak, satu-satunya cara realistis untuk menangani ini adalah dengan tabel pemetaan.

Katakanlah kita memiliki sekolah dengan guru dan siswa, seorang siswa dapat memiliki banyak guru dan sebaliknya.

Jadi kita buat 3 tabel

student
  id unsigned integer auto_increment primary key
  name varchar

teacher
  id unsigned integer auto_increment primary key
  name varchar

link_st
  student_id integer not null
  teacher_id integer not null
  primary key (student_id, teacher_id)

Tabel siswa akan memiliki 1000 record
Tabel guru akan memiliki 20 record
Tabel link_st akan memiliki record sebanyak link (BUKAN 20x1000, tetapi hanya untuk link yang sebenarnya).

Pilihan
Anda memilih mis. siswa per guru menggunakan:

SELECT s.name, t.name 
FROM student
INNER JOIN link_st l ON (l.student_id = s.id)   <--- first link student to the link-table
INNER JOIN teacher t ON (l.teacher_id = t.id)   <--- then link teacher to the link table.
ORDER BY t.id, s.id

Biasanya Anda harus selalu menggunakan inner join di sini.

Membuat tautan
Saat Anda menugaskan seorang guru kepada seorang siswa (atau sebaliknya, itu sama saja) .Anda hanya perlu melakukan:

INSERT INTO link_st (student_id, teacher_id) 
   SELECT s.id, t.id 
   FROM student s 
   INNER JOIN teacher t ON (t.name = 'Jones')
   WHERE s.name = 'kiddo'

Ini sedikit penyalahgunaan dari inner join, tapi ini bisa dilakukan selama namanya unik.
Jika Anda tahu id-nya, Anda bisa langsung memasukkannya saja.
Jika namanya adalah tidak unik ini akan menjadi gagal dan sebaiknya tidak digunakan.

Cara menghindari tautan duplikat
Sangat penting untuk menghindari tautan duplikat, segala macam hal buruk akan terjadi jika Anda memilikinya.
Jika Anda ingin mencegah penyisipan tautan duplikat ke tabel tautan, Anda dapat mendeklarasikan unique indeks pada tautan (disarankan)

ALTER TABLE link_st
  ADD UNIQUE INDEX s_t (student_id, teacher_id); 

Atau Anda dapat melakukan pemeriksaan di pernyataan sisipan (tidak terlalu disarankan, tetapi berhasil).

INSERT INTO link_st (student_id, teacher_id) 
  SELECT s.id, t.id
  FROM student s
  INNER JOIN teacher t ON (t.id = 548)
  LEFT JOIN link_st l ON (l.student_id = s.id AND l.teacher_id = t.id)
  WHERE (s.id = 785) AND (l.id IS NULL)

Ini hanya akan memilih 548, 785 jika bahwa data belum ada di link_st tabel, dan tidak akan mengembalikan apa pun jika data itu sudah ada di link_st. Jadi itu akan menolak untuk memasukkan nilai duplikat.

Jika Anda memiliki sekolah meja, itu tergantung apakah seorang siswa dapat terdaftar di beberapa sekolah (tidak mungkin, tetapi mari kita asumsikan) dan guru dapat terdaftar di beberapa sekolah. Sangat mungkin.

table school
  id unsigned integer auto_increment primary key
  name varchar

table school_members
  id id unsigned integer auto_increment primary key
  school_id integer not null
  member_id integer not null
  is_student boolean not null

Anda dapat membuat daftar semua siswa di sekolah seperti ini:

SELECT s.name
FROM school i
INNER JOIN school_members m ON (i.id = m.school_id)
INNER JOIN student s ON (s.id = m.member_id AND m.is_student = true)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan LOAD DATA LOCAL INFILE di Java

  2. PHP dan MySQL - bagaimana cara menghindari kata sandi dalam kode sumber?

  3. Bagaimana cara membuat <option selected=selected> disetel oleh MySQL dan PHP?

  4. Bagaimana cara mendapatkan skrip pembuatan tabel di MySQL Workbench?

  5. Bagan JFreechart dengan Waktu dari Database SQL