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

Bagaimana cara menyimpan beberapa opsi dalam satu tabel?

Silakan baca Normalisasi Data , Pengindeksan Umum konsep, dan Kunci Asing batasan untuk menjaga data tetap bersih dengan integritas referensial. Ini akan membuat Anda maju.

Menyimpan data dalam array mungkin tampak alami bagi Anda di atas kertas, tetapi bagi mesin db kinerjanya sebagian besar tanpa penggunaan indeks. Selain itu, Anda akan menemukan pada Hari ke-2 bahwa mendapatkan dan memelihara data Anda akan menjadi mimpi buruk.

Berikut ini akan membantu Anda memulai dengan awal yang baik saat Anda mengotak-atik. Bergabung juga.

create table student
(   studentId int auto_increment primary key,
    fullName varchar(100) not null
    -- etc
);

create table dept
(   deptId int auto_increment primary key,
    deptName varchar(100) not null -- Economics
    -- etc
);

create table course
(   courseId int auto_increment primary key,
    deptId int not null,
    courseName varchar(100) not null,
    -- etc
    CONSTRAINT fk_crs_dept FOREIGN KEY (deptId) REFERENCES dept(deptId)
);

create table SCJunction
(   -- Student/Course Junction table (a.k.a Student is taking the course)
    -- also holds the attendance and grade
    id int auto_increment primary key,
    studentId int not null,
    courseId int not null,
    term int not null, -- term (I am using 100 in below examples for this term)
    attendance int not null, -- whatever you want, 100=always there, 0=he must have been partying,
    grade int not null, -- just an idea   
    -- See (Note Composite Index) at bottom concerning next two lines.
    unique key(studentId,courseId,term), -- no duplicates allowed for the combo (note student can re-take it next term)
    key (courseId,studentId),
    CONSTRAINT fk_sc_student FOREIGN KEY (studentId) REFERENCES student(studentId),
    CONSTRAINT fk_sc_courses FOREIGN KEY (courseId) REFERENCES course(courseId)
);

Buat Data Uji

insert student(fullName) values ('Henry Carthage'),('Kim Billings'),('Shy Guy'); -- id's 1,2,3
insert student(fullName) values ('Shy Guy');

insert dept(deptName) values ('History'),('Math'),('English'); -- id's 1,2,3

insert course(deptId,courseName) values (1,'Early Roman Empire'),(1,'Italian Nation States'); -- id's 1 and 2 (History dept)
insert course(deptId,courseName) values (2,'Calculus 1'),(2,'Linear Algebra A'); -- id's 3 and 4 (Math dept)
insert course(deptId,courseName) values (3,'World of Chaucer'); -- id 5 (English dept)

-- show why FK constraints are important based on data at the moment
insert course(deptId,courseName) values (66,'Fly Fishing 101'); -- will generate error 1452. That dept 66 does not exist
-- That error is a good error to have. Better than faulty data

-- Have Kim (studentId=2) enrolled in a few courses
insert SCJunction(studentId,courseId,term,attendance,grade) values (2,1,100,-1,-1); -- Early Roman Empire, term 100 (made up), unknown attendance/grade
insert SCJunction(studentId,courseId,term,attendance,grade) values (2,4,100,-1,-1); -- Linear Algebra A
insert SCJunction(studentId,courseId,term,attendance,grade) values (2,5,100,-1,-1); -- World of Chaucer

-- Have Shy Guy (studentId=3) enrolled in one course only. He is shy
insert SCJunction(studentId,courseId,term,attendance,grade) values (3,5,100,-1,-1); -- Early Roman Empire, term 100 (made up), unknow attendance/grade
-- note if you run that line again, the Error 1062 Duplicate entry happens. Can't take same course more than once per term

Beberapa pertanyaan sederhana.

Kursus apa di jurusan apa?

tampilkan semua, gunakan alias tabel (singkatan) untuk mengurangi pengetikan, keterbacaan (terkadang) lebih baik

select c.courseId,c.courseName,d.deptId,d.deptName
from course c
join dept d
on c.deptId=d.deptId
order by d.deptName,c.courseName -- note the order
+----------+-----------------------+--------+----------+
| courseId | courseName            | deptId | deptName |
+----------+-----------------------+--------+----------+
|        5 | World of Chaucer      |      3 | English  |
|        1 | Early Roman Empire    |      1 | History  |
|        2 | Italian Nation States |      1 | History  |
|        3 | Calculus 1            |      2 | Math     |
|        4 | Linear Algebra A      |      2 | Math     |
+----------+-----------------------+--------+----------+

Siapa yang mengikuti kursus World of Chaucer musim ini?

(mengetahui courseId=5)

Di bawah ini manfaat dari salah satu indeks komposit kami di SCJunction. Komposit adalah indeks pada lebih dari satu kolom.

select s.StudentId,s.FullName
from SCJunction j
join student s
on j.studentId=s.studentId
where j.courseId=5 and j.term=100
+-----------+--------------+
| StudentId | FullName     |
+-----------+--------------+
|         2 | Kim Billings |
|         3 | Shy Guy      |
+-----------+--------------+

Kim Billings terdaftar dalam istilah apa ini?

select s.StudentId,s.FullName,c.courseId,c.courseName
from SCJunction j
join student s
on j.studentId=s.studentId
join course c
on j.courseId=c.courseId
where s.studentId=2 and j.term=100
order by c.courseId DESC -- descending, just for the fun of it
+-----------+--------------+----------+--------------------+
| StudentId | FullName     | courseId | courseName         |
+-----------+--------------+----------+--------------------+
|         2 | Kim Billings |        5 | World of Chaucer   |
|         2 | Kim Billings |        4 | Linear Algebra A   |
|         2 | Kim Billings |        1 | Early Roman Empire |
+-----------+--------------+----------+--------------------+

Kim kewalahan, jadi tinggalkan kelas matematika

delete from SCJunction
where studentId=2 and courseId=4 and term=100

jalankan pernyataan pilih di atas yang menunjukkan apa yang diambil Kim:

+-----------+--------------+----------+--------------------+
| StudentId | FullName     | courseId | courseName         |
+-----------+--------------+----------+--------------------+
|         2 | Kim Billings |        5 | World of Chaucer   |
|         2 | Kim Billings |        1 | Early Roman Empire |
+-----------+--------------+----------+--------------------+

Ah, istilah yang jauh lebih mudah. Ayah tidak akan senang.

Perhatikan hal-hal seperti SCJunction.term. Banyak yang bisa ditulis tentang itu, saya akan melewatkannya saat ini sebagian besar, selain mengatakan itu juga harus di FK di suatu tempat. Anda mungkin ingin istilah Anda lebih mirip SPRING2015 dan bukan int.

Dan sejauh id pergi. Ini adalah cara saya akan melakukannya. Ini adalah preferensi pribadi. Itu akan membutuhkan mengetahui id #, mencarinya. Orang lain dapat memilih untuk memiliki courseId seperti HIST101 dan bukan 17. Itu sangat lebih mudah dibaca (tetapi lebih lambat dalam indeks (hampir tidak). Jadi lakukan yang terbaik untuk Anda.

Catatan Indeks Komposit

Indeks Komposit (INDEX berarti KUNCI, dan sebaliknya) adalah indeks yang menggabungkan beberapa kolom untuk pengambilan data yang cepat. Urutan dibalik untuk dua komposit di tabel SCJunction sehingga, tergantung pada semesta kueri yang mengikuti data Anda, mesin db dapat memilih indeks mana yang akan digunakan untuk pengambilan tercepat berdasarkan kolom paling kiri yang Anda tuju .

Adapun kunci unik, #1, komentar di sebelahnya yang menyatakan tidak ada duplikat (artinya data sampah) cukup jelas. Misalnya, siswa 1 mata kuliah 1 semester 1 tidak boleh ada dua kali dalam tabel tersebut.

Konsep penting untuk dipahami adalah konsep left-most pengurutan nama kolom dalam indeks.

Untuk kueri yang mengikuti studentId hanya , maka kunci yang memiliki studentId terdaftar pertama (left-most ) digunakan. Dalam kueri yang mengikuti courseId hanya , lalu kunci yang memiliki courseId paling kiri digunakan. Dalam kueri yang mengikuti studentId dan courseId, mesin db dapat memutuskan kunci komposit mana yang akan digunakan.

Ketika saya mengatakan "kejar", maksud saya di on clause atau where clause kondisi.

Jika salah satu tidak memiliki dua kunci komposit (dengan kolom 1 dan 2 di dalamnya dibalik), maka dalam kueri di mana kolom yang dicari bukan left-most diindeks, Anda tidak akan diuntungkan dengan penggunaan kunci, dan mengalami tabel yang lambat untuk mengembalikan data.

Jadi, kedua indeks tersebut menggabungkan 2 konsep berikut

  • Pengambilan data cepat berdasarkan paling kiri atau keduanya (kolom studentId dan courseId)
  • Menerapkan non-duplikasi data dalam tabel tersebut berdasarkan nilai studentId, courseId, dan term

Bawa Pulang

Bawa pulang yang penting adalah bahwa tabel Persimpangan membuat pengambilan indeks cepat, dan manajemen data yang waras versus data yang dibatasi koma (pola pikir array) dijejalkan ke dalam kolom, dan semua kesengsaraan menggunakan konstruksi semacam itu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan ID dari beberapa baris yang disisipkan di MySQL?

  2. MySQL TIDAK DALAM permintaan

  3. Cara Mendapatkan Hari Terakhir Bulan Ini di MySQL

  4. Penjelasan Kerangka Ketersediaan Tinggi MySQL – Bagian III:Skenario Kegagalan

  5. Cara Mendeteksi jika Nilai Berisi Setidaknya Satu Digit Numerik di MySQL