JavaRush /Blog Java /Random-MS /Temu bual pembangun: analisis soalan pangkalan data

Temu bual pembangun: analisis soalan pangkalan data

Diterbitkan dalam kumpulan
Hai semua! Kami semua di sini berusaha ke arah satu matlamat - untuk menjadi Pembangun Java . Mungkin peringkat paling penting dalam laluan untuk menjadi seorang profesional ialah temuduga teknikal. Sebagai peraturan, penemuduga pergi melalui topik utama, bertanya beberapa soalan. Dalam artikel ini, kita akan bercakap tentang satu topik utama tersebut - pangkalan data . Mari kita lihat soalan yang paling kerap ditanya dan cuba menjawabnya tanpa menyelam lebih mendalam ke dalam bahan, kerana dalam kes ini jumlah buku tidak akan mencukupi untuk kita! Jadi, mari kita pergi.Temu bual pembangun: analisis soalan pangkalan data - 1

1. Apakah pangkalan data? Apakah jenis mereka dibahagikan kepada?

Apakah yang dimaksudkan dengan DBMS?

Temu bual pembangun: analisis soalan pangkalan data - 2Pangkalan data (DB) ialah struktur tersusun yang direka untuk menyimpan, menukar dan memproses maklumat yang saling berkaitan, terutamanya dalam jumlah yang besar. Dengan kata lain, pangkalan data ialah storan data berstruktur. Contohnya, buku telefon.

Jenis pangkalan data

  1. Pangkalan data hubungan ialah koleksi data dengan perhubungan yang telah ditetapkan di antara mereka. Data disimpan sebagai satu set jadual yang terdiri daripada lajur dan baris. Jadual menyimpan maklumat tentang objek yang diwakili dalam pangkalan data. Setiap lajur jadual menyimpan jenis data tertentu, dan setiap sel menyimpan nilai atribut.
  2. Sistem bukan perhubungan (NoSQL) ialah sistem yang direka bentuk untuk model data tertentu dengan skema yang fleksibel. Dalam erti kata lain, ini adalah pangkalan data yang menyimpan data bukan dalam bentuk skema jadual, baris dan lajur, tetapi dalam format lain.
Anda boleh membaca lebih lanjut mengenai pangkalan data bukan perhubungan dalam artikel ini: Panduan NoSQL untuk Pembangun . Sistem pengurusan pangkalan data (DBMS) ialah satu set perisian yang dengannya pengguna boleh mencipta pangkalan data (DB) dan melakukan pelbagai operasi padanya: menambah, mengemas kini, memadam, memilih, dll. DBMS menjamin keselamatan, integriti, keselamatan data penyimpanan dan membolehkan anda memberikan akses kepada pentadbiran pangkalan data. Sebagai contoh, MySql ialah DBMS yang menyediakan akses kepada pangkalan data hubungan atau MongoDB untuk pangkalan data bukan hubungan.

2. Apakah normalisasi? Borang normal? Berapa banyak bentuk normalisasi yang ada? Namakan tiga yang pertama.

Normalisasi ialah proses menyusun dan menstruktur data dalam pangkalan data, yang memberikan fleksibiliti pangkalan data yang lebih besar dengan menghapuskan lebihan dan ketidakkonsistenan kebergantungan. Bentuk normal ialah sifat jadual, dipertimbangkan dalam konteks normalisasi, yang mencirikan jadual dari segi kesederhanaan dan ketepatan struktur. Bentuk normal ditakrifkan sebagai satu set keperluan yang mesti dipenuhi oleh jadual. Terdapat enam bentuk biasa secara keseluruhan, tetapi dalam praktiknya tidak lebih daripada tiga yang pertama digunakan:
  1. Bentuk normal pertama:
    • Semua atribut adalah mudah (iaitu, atom dan tidak boleh dibahagikan);
    • Semua data adalah skalar (iaitu, positif);
    • Tiada baris pendua (untuk ini, kunci utama dibuat untuk setiap baris).
  2. Bentuk normal kedua:
    • Syarat bentuk normal pertama dipenuhi;
    • Setiap atribut bukan kunci merujuk kepada kunci utama.
  3. Bentuk normal ketiga:
    • Syarat kumpulan normal kedua dipenuhi;
    • Medan bukan kunci adalah bebas daripada medan bukan kunci lain: ia hanya boleh dikaitkan dengan kunci utama.

3. Denormalisasi

Denormalisasi ialah pengurangan atau pelanggaran bentuk normalisasi pangkalan data yang disengajakan, biasanya untuk mempercepatkan pembacaan daripada pangkalan data dengan menambah data berlebihan. Secara umum, ini adalah proses songsang kepada normalisasi. Ini berlaku kerana teori bentuk normal tidak selalu boleh digunakan dalam amalan. Sebagai contoh, nilai bukan atom tidak selalunya "jahat": kadang-kadang malah sebaliknya. Dalam sesetengah kes, gabungan tambahan diperlukan semasa melaksanakan pertanyaan, terutamanya apabila memproses sejumlah besar maklumat. Ini akhirnya boleh meningkatkan prestasi. Pangkalan data yang dimaksudkan untuk analitik sering dinyahnormalkan untuk mempercepatkan pelaksanaan pertanyaan. Sebagai contoh, anda selalunya akan mencuba beberapa data untuk laporan yang lajur bukan kunci akan berkaitan antara satu sama lain. Anda dengan sengaja mengalih keluar bentuk penormalan ketiga dan menggabungkan semuanya dalam satu jadual untuk memudahkan pensampelan - supaya anda tidak perlu membuat pertanyaan tambahan pada jadual lain.

4. Indeks

Indeks ialah set nilai yang diisih yang dikaitkan dengan jadual atau paparan dengan lajur tertentu yang mempercepatkan pengambilan data. Iaitu, ini adalah sejenis indeks: seperti abjad dalam buku telefon, yang membantu kami apabila mencari mengikut nama keluarga. Jika digunakan dengan betul, ciri ini boleh meningkatkan prestasi dengan sangat baik apabila bekerja dengan pangkalan data yang besar. Atau anda boleh menurunkannya banyak. Untuk mempercepatkan carian, kunci ini disimpan dalam struktur pokok seimbang yang melaluinya carian dilakukan. Sebagai peraturan, indeks perlu dimasukkan pada medan yang paling kerap dicari. Anda harus berfikir tentang membuat indeks tidak lebih awal daripada apabila anda mempunyai sekurang-kurangnya 10 ribu rekod. Jika tidak, anda tidak akan melihat hasil yang ketara, kerana pengoptimuman pramatang adalah EVIL . Dan bagaimanakah indeks boleh menjejaskan prestasi sistem, anda bertanya? Apabila data baharu dimasukkan atau data lama dipadamkan, struktur pokok seimbang akan dikira semula. Sebenarnya, lebih banyak data dan indeks, lebih banyak pokok yang perlu dikira. Bayangkan situasinya: anda mempunyai kira-kira 20,000 rekod dan 7 indeks pada jadual ini. Iaitu, apabila memasukkan data, anda perlu mengira semula 7 pokok, setiap satu dengan 20,000 rekod. Tegasnya, menggunakan indeks untuk jadual yang mana data akan kerap ditambah/dipadamkan adalah tidak disyorkan sama sekali. Akhir sekali, saya ingin ambil perhatian bahawa indeks untuk lajur yang nilainya sering dijumpai nulltidak akan berkesan, jadi tidak patut menambahkannya pada lajur tersebut.

Apakah perbezaan antara indeks berkelompok dan tidak berkelompok dalam SQL?

Berkelompok:

  • Menyediakan susunan fizikal untuk medan yang dipilih;
  • Jika jadual mempunyai indeks berkelompok, ia dikatakan berkelompok;
  • Tidak lebih daripada satu indeks setiap jadual diperlukan;
  • Dalam MySQL, indeks berkelompok tidak dinyatakan secara eksplisit oleh pengguna, kerana jika anda tidak mentakrifkan KUNCI UTAMA pada jadual anda, MySQL mencari indeks pertama UNIQUEdi mana semua lajur utama adalah NOT NULL, dan InnoDB menggunakannya sebagai indeks berkelompok.

Tidak berkelompok:

  • Sehingga 999 indeks tidak berkelompok boleh dilakukan setiap jadual;
  • Mengandungi penunjuk ke baris dengan data sebenar dalam jadual;
  • Tidak menyediakan susunan fizikal;
  • Untuk indeks bukan berkelompok, terdapat jadual berasingan dengan data yang diisih, iaitu, satu jadual untuk satu lajur di mana indeks terletak, oleh itu, apabila meminta data yang bukan sebahagian daripada medan tertentu, pertanyaan akan dilakukan terlebih dahulu pada medan dalam jadual ini, dan hanya kemudian pertanyaan tambahan terhadap baris dalam jadual asal.
Mencipta indeks bukan berkelompok:
CREATE INDEX index_name ON table_name(column_name)

6. Apakah indeks komposit?

Indeks komposit - dibina dengan penghantaran ke beberapa lajur pada masa yang sama. Dalam erti kata lain, ia adalah indeks kompleks yang terdiri daripada beberapa lajur. Indeks sedemikian digunakan apabila lebih daripada satu lajur muncul dalam satu pertanyaan. Mencipta indeks komposit:
CREATE INDEX index_name ON table_name(first_column_name, second_column_name, third_column_name)
Biasanya, indeks ini digunakan apabila data dalam berbilang lajur berkaitan secara logik.

7. Apakah indeks penutup? Indeks unik?

Indeks penutup ialah indeks yang mencukupi untuk menjawab pertanyaan tanpa mengakses jadual itu sendiri. Menggunakan indeks ini, anda boleh mendapatkan keseluruhan baris data, tetapi sebenarnya ini tidak diperlukan. Kerana anda tidak perlu pergi terus ke jadual sumber dan boleh menjawab hanya menggunakan indeks, indeks meliputi sedikit lebih cepat untuk digunakan. Pada masa yang sama, jangan lupa bahawa lebih banyak lajur, semakin menyusahkan dan perlahan indeks itu sendiri. Jadi anda tidak sepatutnya menyalahgunakan ini. Di atas kita bercakap tentang indeks berkelompok dan tidak berkelompok, yang boleh menjadi unik . Ini bermakna tiada dua medan yang mempunyai nilai yang sama untuk kunci indeks. Jika tidak, indeks tidak akan unik, kerana beberapa baris mungkin mengandungi nilai yang sama. Contoh mencipta indeks bukan berkelompok yang unik:
CREATE UNIQUE INDEX index_name ON table_name(column_name)

8. Apakah kunci utama

Kunci utama ialah medan dalam jadual yang mengenal pasti setiap baris dalam jadual pangkalan data. Hanya ada satu medan sedemikian dalam jadual, dan semua nilai mestilah unik. Tidak mengingatkan anda tentang apa-apa? Temu bual pembangun: analisis soalan pangkalan data - 3Lagipun, kunci utama tidak lebih daripada indeks berkelompok yang unik . Sebagai peraturan, kunci utama dibuat semasa membuat jadual:
CREATE TABLE table_name(
column_name int PRIMARY KEY,..)
Sekatan akan ditambahkan secara automatik pada lajur ini - NOT NULL. Anda juga boleh menetapkan kunci untuk jadual yang telah dibuat:
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
Jika kunci utama ditambah dengan cara yang diterangkan di atas, maka nilai medan yang dinyatakan sebagai kunci utama ( column_name) diperiksa untuk memastikan ia tidak mengandungi nilai nol (kekangan juga akan ditambah - NOT NULL).

Apakah kunci asing?

Kunci asing ialah sifat yang dicipta untuk menyediakan hubungan antara jadual. Biasanya, kunci asing ditetapkan pada lajur dalam subjadual dan menunjuk ke salah satu lajur daripada jadual utama. Boleh ditentukan seperti semasa membuat jadual:
CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) }
Jadi selepas membuat jadual:
ALTER TABLE table_name
ADD FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name));
Anda boleh menetapkan gelagat kunci asing apabila memanipulasi medan yang dirujuknya. ON DELETEManipulasi boleh terdiri daripada jenis berikut ON UPDATE: Pilihan tingkah laku yang mungkin:
  • CASCADE— dengan sifat ini, baris daripada jadual bergantung akan dipadam atau ditukar secara automatik apabila baris berkaitan dipadamkan atau ditukar dalam jadual utama;
  • SET NULL— dengan sifat ini, apabila baris yang berkaitan dipadamkan atau dikemas kini daripada jadual utama, nilai NULLuntuk lajur kunci asing akan ditetapkan;
  • NO ACTION— menolak percubaan untuk memadam atau menukar baris dalam jadual utama jika terdapat baris berkaitan dalam jadual bergantung;
  • RESTRICT- bersamaan dengan NO ACTION;
  • SET DEFAULT- dengan sifat ini, apabila baris yang berkaitan dipadamkan atau dikemas kini daripada jadual utama, nilai lalai (jika ada) untuk lajur kunci asing akan ditetapkan.
Contoh penggunaan:
CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) ON UPDATE CASCADE ON DELETE CASCADE }
ON DELETEJika gelagat untuk dan tidak ditetapkan secara eksplisit ON UPDATE, gelagat akan ditetapkan kepada RESTRICT.

10. Jenis sambungan antara jadual (Sertai)

Sambungan antara jadual disediakan berdasarkan data biasa (medan). Ini berlaku menggunakan operator JOIN, operasi yang memadankan baris dari satu jadual dengan baris dalam yang lain. Pemetaan dilakukan supaya lajur kedua-dua jadual adalah bersebelahan, walaupun ia boleh diperoleh daripada jadual berasingan. Dan jika kita mempunyai medan biasa untuk tiga jadual, kita boleh memaparkan datanya sebagai satu jadual biasa. Walau bagaimanapun, perlu dipertimbangkan bahawa lebih sedikit jadual yang dicantumkan, lebih cepat pertanyaan akan dijalankan. Jadi, jenis JOIN:
  • INNER JOIN- sambungan yang menunjukkan hanya data daripada jadual pertama yang sepadan dengan beberapa data daripada jadual kedua. Selebihnya turun.Temu bual pembangun: analisis soalan pangkalan data - 4
  • LEFT JOIN- sambungan yang menunjukkan semua data daripada jadual pertama dan data yang sepadan daripada kedua, jika ada. Jika tiada data yang sepadan, medan untuk data daripada jadual kedua akan kosong.Temu bual pembangun: analisis soalan pangkalan data - 5
  • RIGHT JOIN- sambungan yang menunjukkan semua data daripada jadual kedua dan data yang sepadan daripada yang pertama, jika ada. Jika tiada data yang sepadan, medan untuk data daripada jadual pertama akan kosong.Temu bual pembangun: analisis soalan pangkalan data - 6
  • FULL JOIN- sambungan yang menunjukkan semua data daripada jadual pertama dan kedua. Jika tiada data berkaitan dalam jadual lain, medan untuk data tersebut akan kosong.Temu bual pembangun: analisis soalan pangkalan data - 7
  • CROSS JOIN- cantuman silang di mana setiap baris jadual pertama dicantumkan pada setiap baris jadual kedua (masing-masing kepada setiap satu). Maksudnya, jika dua jadual mempunyai 3 baris setiap satu, selepas ini bergabung kita akan mendapat hasil 9 baris.Temu bual pembangun: analisis soalan pangkalan data - 8
Contoh Join(inner):
SELECT *
FROM first_table
INNER JOIN second_table ON first_table.some_column = second_table.some_column

11. Apakah sifat ACID dalam pangkalan data?

A - Atomicity , memastikan bahawa tiada transaksi sebahagiannya komited kepada sistem. Sama ada semua suboperasinya dilakukan, atau tidak. Sebagai contoh, memindahkan wang dari bank ke akaun lain melibatkan dua operasi:
  1. Pindahkan wang ke akaun bank.
  2. Pindahkan wang dari akaun bank ke akaun tertentu.
Tetapi apa sahaja boleh berlaku. Sebagai contoh, mereka akan pergi ke bank, dan kemudian beberapa ralat akan berlaku dan operasi kedua tidak akan selesai. Atau sebaliknya: hanya operasi kedua akan dilakukan. Oleh itu, tindakan ini dijalankan dalam satu transaksi, dan hasilnya adalah sama ada semua atau tiada. C - Ketekalan : Setiap transaksi yang berjaya sentiasa merekodkan hanya keputusan yang boleh diselesaikan. Ini memastikan bahawa semua sekatan dipenuhi (contohnya, NOT NULL), jika tidak, transaksi akan ditarik balik. Dan - pengasingan : semasa pelaksanaan transaksi, transaksi selari tidak boleh menjejaskan keputusannya. Ini memberi kami keupayaan untuk menyembunyikan keadaan data bukan akhir daripada semua orang. Sebenarnya, inilah sebabnya transaksi yang tidak berjaya tidak boleh memecahkan apa-apa. Sedikit lebih rendah kita akan berkenalan dengan tahap pengasingan transaksi. D - Ketahanan : Jika transaksi selesai, maka anda boleh yakin bahawa perubahan yang dibuatnya tidak akan dibatalkan kerana beberapa kegagalan.

12. Tahap pengasingan urus niaga

Setiap tahap pengasingan membenarkan/melarang tindakan tertentu (peluang):
  • bacaan hantu - dalam transaksi yang sama, permintaan data yang sama memberikan hasil yang berbeza, yang berlaku disebabkan penambahan data oleh transaksi lain (selari).
  • bacaan tidak berulang - dalam transaksi yang sama, permintaan data yang sama memberikan hasil yang berbeza, yang berlaku disebabkan oleh perubahan atau pemadaman data oleh transaksi lain (selari).
  • Bacaan "kotor" - membaca data yang ditambah atau diubah oleh transaksi yang tidak akan ditarik balik;
  • kemas kini hilang - apabila urus niaga berbeza menukar blok data yang sama pada masa yang sama, semua perubahan kecuali yang terakhir hilang (serupa dengan "keadaan perlumbaan" dalam multithreading).
Untuk kemudahan, kami mempertimbangkan tahap pengasingan dan keupayaannya dalam jadual:
Tahap penebat Bacaan hantu Bacaan tidak berulang bacaan "kotor". kemas kini hilang
BOLEH BERSIRI + + + +
REPEATABLE_READ - + + +
READ_COMMITTED - - + +
READ_UNCOMMITTED - - - +

13. Apakah suntikan SQL?

Suntikan SQL adalah salah satu kaedah menggodam laman web, intipatinya adalah suntikan beberapa kod SQL ke dalam data melalui GETpertanyaan POSTatau Kuki. Jika tapak web melakukan suntikan sedemikian, adalah mungkin untuk mendapatkan akses kepada pangkalan data dan menggodam aplikasi. Sebagai contoh, kita tahu nama beberapa pembolehubah. Katakan column_namedengan jenis boolean. Jika sistem terdedah kepada suntikan, kami boleh menambah OR column_name=truedan kemudian menulis semua yang kami perlukan daripada pangkalan data. ORakan mencipta keadaan ATAU, dan ungkapan kami selepasnya akan sentiasa true, yang akan membawa kami lebih jauh. Serangan ke atas tapak web seperti suntikan SQL mungkin disebabkan oleh pemprosesan data masuk yang tidak betul yang digunakan dalam pertanyaan SQL. Apabila menyambung ke pangkalan data menggunakan JDBC , anda menggunakan pelbagai Statements. Untuk meningkatkan keselamatan, adalah perlu untuk menggunakan PreparedStatementbukan yang biasa Statement, kerana apabila digunakan, Statementrentetan pertanyaan dan nilai hanya ditambah bersama, menjadikan suntikan mungkin. Sebaliknya, terdapat PreparedStatementtemplat permintaan khusus, dan data dimasukkan ke dalamnya dengan tanda petikan ditunjukkan. Akibatnya, suntikan SQL akan dilihat hanya sebagai perwakilan rentetan bagi beberapa medan. Untuk melindungi daripada suntikan SQL, anda boleh menggunakan semakan berdasarkan ungkapan biasa (anda boleh membaca lebih lanjut mengenai ungkapan biasa dalam artikel ini ). Собеседование разработчика: разбор вопросов по базам данных - 9Pilihan lain ialah menetapkan had pada bilangan aksara parameter masuk: sebagai contoh, jika anda harus menerima nombor tidak lebih daripada 9999, had empat aksara masuk akan dilakukan. Ia akan mengurangkan risiko penggodaman menggunakan suntikan SQL. Anda boleh mengetahui lebih lanjut tentang keselamatan di Java daripada artikel "Keselamatan di Java: amalan terbaik" .

14. Apakah prosedur tersimpan? Fungsi tersimpan? Pencetus?

Prosedur tersimpan dalam SQL ialah entiti dalam pangkalan data, iaitu satu set arahan SQL yang disusun sekali dan disimpan pada pelayan. Dalam satu perkataan, ini adalah analog kaedah di Jawa. Prosedur tersimpan boleh melakukan tindakan pada data, kedua-dua pertanyaan biasa dan beberapa tindakan yang tidak tersedia untuk pertanyaan biasa. Prosedur ialah entiti SQL yang dibuat sekali dan kemudian dipanggil dengan menghantar argumen. Kelebihan pendekatan ini ialah arahan ini boleh digunakan semula lebih daripada sekali. Prosedur tersimpan meningkatkan prestasi, meningkatkan keupayaan pengaturcaraan dan menyokong ciri keselamatan data. Mari kita pertimbangkan untuk membuat prosedur:
CREATE PROCEDURE procedure_name (first_param some_type, second_param some_type..)
 begin
……...
 end
Memanggil prosedur:
CALL procedure_name (first_param, second_param…..);
Fungsi tersimpan ialah sejenis prosedur tersimpan. Perbezaan antara fungsi ialah ia sentiasa mengembalikan hanya satu nilai, manakala prosedur sentiasa mengembalikan satu set nilai. Prosedur tersimpan tidak boleh dicampur dengan SQL biasa, manakala fungsi tersimpan boleh - dan ini adalah kelebihannya. Sebaliknya, fungsi yang disimpan mempunyai lebih banyak batasan daripada prosedur. Mencipta fungsi tersimpan:
CREATE FUNCTION function_name (first_param, second_param…..)
RETURNS some_type
 begin
……...
RETURN some_value;
end
Memanggil fungsi tersimpan:
SELECT function_name(first_param, second_param…..);
Pencetus ialah satu lagi jenis prosedur tersimpan yang tidak dipanggil terus oleh pengguna, tetapi diaktifkan apabila data diubah suai. Iaitu, prosedur ini diaktifkan apabila syarat tertentu dipenuhi, seperti, INSERTatau DELETE, atau UPDATEdata dalam lajur tertentu jadual tertentu. Apabila pencetus dicetuskan ditentukan menggunakan kata kunci BEFORE(cetusan dicetuskan sebelum peristiwa yang berkaitan) atau AFTER(selepas peristiwa).
CREATE TRIGGER trigger_name
ON table_name
AFTER INSERT
 begin
……...
 end

15. Berlatih

Walau apa pun, soalan SQL yang paling biasa semasa temu duga adalah latihan - penyelesaian masalah. Tidak ada gunanya cuba meneka tugasan yang akan anda temui, kerana semuanya bergantung pada kecanggihan imaginasi orang yang bertentangan. Oleh itu, satu-satunya pilihan kerja adalah untuk menjadi lebih baik pada pertanyaan SQL dengan kerumitan yang berbeza-beza. sql-ex.ru boleh berfungsi sebagai sumber untuk berlatih dalam pelbagai tugas . Selepas dua puluh tugasan pertama selesai, agak sukar bagi rakan bicara anda untuk menakutkan anda dengan sebarang tugasan SQL. Собеседование разработчика: разбор вопросов по базам данных - 11Itu sahaja untuk hari ini: Saya berharap selepas membaca artikel ini, soalan tentang pangkalan data tidak akan menyebabkan sebarang kesulitan atau masalah. Terima kasih atas perhatian anda dan jumpa lagi!
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION