JavaRush /Java Blog /Random-JA /開発者インタビュー: データベースに関する質問の分析
Константин
レベル 36

開発者インタビュー: データベースに関する質問の分析

Random-JA グループに公開済み
こんにちは、みんな!私たちは皆、Java 開発者になるという 1 つの目標に向かってここに取り組んでいます。おそらく、プロになるための道で最も重要な段階は技術面接です。原則として、面接官は主要なトピックを検討し、いくつかの質問をします。この記事では、そのような重要なトピックの 1 つであるデータベースについて説明します。この場合、この本の量では十分ではないため、最もよくある質問を見て、内容には深く立ち入らずにそれらに答えてみましょう。じゃ、行こう。開発者インタビュー: データベースに関する質問の分析 - 1

1. データベースとは何ですか? どのようなタイプに分けられるのでしょうか?

DBMS とはどういう意味ですか?

開発者インタビュー: データベースに関する質問の分析 - 2データベース (DB) は、主に大容量の相互に関連する情報を保存、変更、処理するために設計された組織化された構造です。言い換えれば、データベースは構造化されたデータストレージです。たとえば、電話帳。

データベースの種類

  1. リレーショナル データベースは、データ間の関係が事前に定義されたデータのコレクションです。データは、列と行で構成されるテーブルのセットとして保存されます。テーブルには、データベース内で表されるオブジェクトに関する情報が格納されます。テーブルの各列には特定のデータ型が格納され、各セルには属性値が格納されます。
  2. 非リレーショナル システム (NoSQL) は、柔軟なスキーマを備えた特定のデータ モデル向けに設計されたシステムです。言い換えれば、これらは、表形式、行、列の形式ではなく、他の形式でデータを保存するデータベースです。
非リレーショナル データベースの詳細については、「開発者向け NoSQL ガイド」の記事を参照してください。 データベース管理システム (DBMS) は、ユーザーがデータベース (DB) を作成し、それらに対して追加、更新、削除、選択などのさまざまな操作を実行できる一連のソフトウェアです。DBMS は、データベースの安全性、完全性、セキュリティを保証します。データ ストレージにアクセスし、データベース管理へのアクセスを許可できます。たとえば、MySql は、リレーショナル データベースまたは非リレーショナル データベースの MongoDB へのアクセスを提供する DBMS です。

2. 正規化とは何ですか? 正規化された形式? 正規化の形式はいくつありますか? 最初の 3 つを挙げてください。

正規化は、データベース内のデータを整理および構造化するプロセスであり、依存関係の冗長性や不整合を排除することでデータベースの柔軟性が向上します。 正規形は、正規化のコンテキストで考慮されるテーブルのプロパティであり、構造の単純さと正確さの観点からテーブルを特徴付けます。正規形は、テーブルが満たさなければならない一連の要件として定義されます。正規形は全部で 6 つありますが、実際には最初の 3 つだけが使用されます。
  1. 第一正規形:
    • すべての属性は単純です (つまり、原子的で分割不可能です)。
    • すべてのデータはスカラー (つまり、正) です。
    • 重複する行はありません (このために、行ごとに主キーが作成されます)。
  2. 第 2 正規形:
    • 第 1 正規形の条件が満たされています。
    • キー以外の各属性は主キーを参照します。
  3. 第 3 正規形:
    • 2 番目の正規グループの条件が満たされています。
    • 非キー フィールドは他の非キー フィールドから独立しており、主キーにのみ関連付けることができます。

3. 非正規化

非正規化とは、データベース正規化の形式を意図的に削減または違反することであり、通常は冗長データを追加することでデータベースからの読み取りを高速化します。一般に、これは正規化とは逆のプロセスです。これは、正規形の理論が実際には常に適用できるわけではないために発生します。たとえば、非アトミック値は必ずしも「悪」であるとは限りません。場合によってはその逆です。場合によっては、クエリの実行時、特に大量の情報を処理する場合に追加の結合が必要になります。これにより、最終的にパフォーマンスが向上します。分析を目的としたデータベースは、クエリの実行を高速化するために非正規化されることがよくあります。たとえば、非キー列が相互に関連するレポート用にいくつかのデータをサンプリングすることがよくあります。サンプリングを容易にするために、3 番目の正規化形式を意図的に削除し、すべてを 1 つのテーブルに結合します。これにより、他のテーブルに対して追加のクエリを実行する必要がなくなります。

4. インデックス

インデックスは、データの取得を高速化する、特定の列を持つテーブルまたはビューに関連付けられた並べ替えられた値のセットです。つまり、これは一種のインデックスであり、電話帳のアルファベットのようなもので、姓で検索するときに役立ちます。この機能を正しく使用すると、大規模なデータベースを操作する場合のパフォーマンスが大幅に向上します。あるいは大幅に下げることもできます。検索を高速化するために、これらのキーはバランスの取れたツリー構造に保存され、検索はそれを通じて実行されます。原則として、最も頻繁に検索されるフィールドにインデックスを入力する必要があります。少なくとも 10,000 件のレコードがある場合には、インデックスの作成を検討する必要があります。そうしないと、時期尚早な最適化がEVILになるため、目立った結果は得られません。そして、インデックスはシステムのパフォーマンスにどのような影響を与えるのでしょうか? 新しいデータが挿入されるか、古いデータが削除されると、バランスのとれたツリー構造が再計算されます。実際には、データとインデックスが増えるほど、より多くのツリーをカウントする必要があります。このテーブルには約 20,000 のレコードと 7 つのインデックスがある状況を想像してください。つまり、データを挿入するときに、それぞれ 20,000 レコードを持つ 7 つのツリーを再計算する必要があります。厳密に言えば、データが頻繁に追加/削除されるテーブルにインデックスを使用することはまったく推奨されません。null最後に、値が頻繁に見つかる列のインデックスはそれほど効果的ではないため、そのような列にインデックスを追加する価値はないことに注意してください。

SQL のクラスター化インデックスと非クラスター化インデックスの違いは何ですか?

クラスター化:

  • 選択したフィールドに物理的な順序を提供します。
  • テーブルにクラスター化インデックスがある場合、そのテーブルはクラスター化されていると言われます。
  • テーブルごとに必要なインデックスは 1 つだけです。
  • MySQL では、クラスター化インデックスはユーザーによって明示的に指定されません。テーブルに PRIMARY KEY を定義しない場合、MySQL はUNIQUEすべてのキー列が である最初のインデックスを検索しNOT NULL、InnoDB はそれをクラスター化インデックスとして使用します。

非クラスター化:

  • 単一テーブルには最大 999 個の非クラスター化インデックスが可能です。
  • テーブル内の実際のデータを含む行へのポインタが含まれます。
  • 物理的な秩序を提供しません。
  • 非クラスター化インデックスの場合、並べ替えられたデータを含む個別のテーブル、つまり、インデックスが配置される 1 つの列に対して 1 つのテーブルが存在するため、特定のフィールドの一部ではないデータをリクエストする場合、クエリは最初にこのテーブルのフィールドに追加した後、元のテーブルの行に対する追加のクエリを実行します。
非クラスター化インデックスの作成:
CREATE INDEX index_name ON table_name(column_name)

6. 複合インデックスとは何ですか?

複合インデックス- 複数の列に同時に送信することで構築されます。つまり、複数の列で構成される複雑なインデックスです。このようなインデックスは、1 つのクエリに複数の列が出現する場合に使用されます。複合インデックスの作成:
CREATE INDEX index_name ON table_name(first_column_name, second_column_name, third_column_name)
通常、これらのインデックスは、複数の列のデータが論理的に関連している場合に使用されます。

7. カバリングインデックスとは何ですか? ユニークなインデックス?

カバリング インデックスは、テーブル自体にアクセスせずにクエリに答えるのに十分なインデックスです。このインデックスを使用すると、データの行全体を取得できますが、実際にはこれは必要ありません。ソース テーブルに直接移動する必要がなく、インデックスだけを使用して回答できるため、カバリング インデックスを使用すると若干高速になります。同時に、列が増えれば増えるほど、インデックス自体が複雑になり、遅くなるということを忘れないでください。したがって、これを悪用すべきではありません。上記では、一意にすることができるクラスター化インデックスと非クラスター化インデックスについて説明しました。これは、インデックス キーの値が同じフィールドが 2 つもないことを意味します。そうしないと、複数の行に同じ値が含まれる可能性があるため、インデックスは一意ではなくなります。一意の非クラスター化インデックスを作成する例:
CREATE UNIQUE INDEX index_name ON table_name(column_name)

8. 主キーとは何ですか

主キーは、データベース テーブル内の各行を識別するテーブル内のフィールドです。このようなフィールドはテーブル内に 1 つだけ存在でき、すべての値は一意である必要があります。何も思い出しませんでしたか?開発者インタビュー: データベースの質問の分析 - 3結局のところ、主キーは一意のクラスター化インデックスにすぎません。原則として、主キーはテーブルの作成時に作成されます。
CREATE TABLE table_name(
column_name int PRIMARY KEY,..)
この列には制限が自動的に追加されますNOT NULL。すでに作成されているテーブルのキーを設定することもできます。
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
上記の方法で主キーが追加された場合、主キー ( ) として指定されたフィールドの値がcolumn_nameチェックされ、null 値が含まれていないことが確認されます (制約も追加されます - NOT NULL)。

外部キーとは何ですか?

外部キーは、テーブル間の関係を提供するために作成されるプロパティです。通常、外部キーはサブテーブルの列に設定され、メインテーブルの列の 1 つを指します。テーブルの作成時と同様に指定できます。
CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) }
したがって、テーブルを作成した後は次のようになります。
ALTER TABLE table_name
ADD FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name));
外部キーが参照するフィールドを操作するときの外部キーの動作を設定できます。ON DELETE操作には次のタイプがありますON UPDATE。考えられる動作オプション:
  • CASCADE— このプロパティを使用すると、メイン テーブルで関連する行が削除または変更されると、依存テーブルの行も自動的に削除または変更されます。
  • SET NULL— このプロパティを使用すると、関連する行がメイン テーブルから削除または更新されるときに、NULL外部キー列の値が設定されます。
  • NO ACTION— 依存テーブルに関連する行がある場合、メインテーブルの行を削除または変更する試みを拒否します。
  • RESTRICT- に相当NO ACTION;
  • SET DEFAULT- このプロパティを使用すると、関連行がメイン テーブルから削除または更新されると、外部キー列のデフォルト値 (存在する場合) が設定されます。
使用例:
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 DELETEおよびの動作が 明示的に設定されていない場合ON UPDATE、動作は に設定されますRESTRICT

10. テーブル間の接続の種類(結合)

テーブル間の接続は共通のデータ(フィールド)に基づいて提供されます。JOINこれは、あるテーブルの行を別のテーブルの行と照合する操作である 演算子 を使用して行われます。マッピングは、両方のテーブルの列が隣接するように行われますが、これらの列は別々のテーブルから取得できます。また、3 つのテーブルに共通のフィールドがある場合、それらのデータを 1 つの共通のテーブルとして表示できます。ただし、結合されるテーブルの数が少ないほど、クエリの実行が速くなることを考慮する価値があります。したがって、タイプは次のとおりですJOIN
  • INNER JOIN- 2 番目のテーブルの一部のデータに対応する最初のテーブルのデータのみを表示する接続。残りは下がります。開発者インタビュー: データベースに関する質問の分析 - 4
  • LEFT JOIN- 最初のテーブルのすべてのデータと、2 番目のテーブルの対応するデータ (存在する場合) を表示する接続。対応するデータがない場合、2 番目のテーブルのデータのフィールドは空になります。開発者インタビュー: データベースに関する質問の分析 - 5
  • RIGHT JOIN- 2 番目のテーブルのすべてのデータと、最初のテーブルの対応するデータ (存在する場合) を表示する接続。対応するデータがない場合、最初のテーブルのデータのフィールドは空になります。開発者インタビュー: データベースの質問の分析 - 6
  • FULL JOIN- 最初と 2 番目のテーブルのすべてのデータを表示する接続。他のテーブルに関連するデータがない場合、そのデータのフィールドは空になります。開発者インタビュー: データベースに関する質問の分析 - 7
  • CROSS JOIN- 最初のテーブルの各行が 2 番目のテーブルの各行に (それぞれがそれぞれに) 結合されるクロス結合。つまり、2 つのテーブルにそれぞれ 3 行がある場合、この結合の後、9 行の結果が得られます。開発者インタビュー: データベースの質問の分析 - 8
Join(inner)
SELECT *
FROM first_table
INNER JOIN second_table ON first_table.some_column = second_table.some_column

11. データベースの ACID プロパティとは何ですか?

A - アトミック性。トランザクションがシステムに部分的にコミットされていないことを保証します。そのサブ操作はすべて実行されるか、まったく実行されません。たとえば、銀行から別の口座に送金するには、次の 2 つの操作が必要です。
  1. 銀行口座にお金を送金します。
  2. 銀行口座から特定の口座に送金します。
しかし、何が起こる可能性もあります。たとえば、銀行に行くと、何らかのエラーが発生して 2 番目の操作が完了しません。またはその逆: 2 番目の操作のみが実行されます。したがって、これらのアクションは 1 つのトランザクション内で実行され、結果はすべてか何もかのどちらかになります。 C - 一貫性: 成功した各トランザクションは常に解決可能な結果のみを記録します。これにより、すべての制限 (たとえば、NOT NULL) が満たされることが保証されます。満たされていない場合、トランザクションはロールバックされます。 そして - 分離: トランザクションの実行中、並列トランザクションはその結果に影響を与えてはなりません。これにより、最終的なデータ状態以外のデータを誰からも隠すことができます。実際、トランザクションが失敗しても何も壊れないのはこれが理由です。もう少し低いレベルでは、トランザクション分離レベルについて説明します。 D - 耐久性: トランザクションが完了すると、何らかの障害によって加えられた変更がキャンセルされないことが保証されます。

12. トランザクション分離レベル

各分離レベルでは、特定のアクション (機会) が許可/禁止されます。
  • ファントム読み取り- 同じトランザクション内で、同じデータ要求が異なる結果を返します。これは、別の (並列) トランザクションによるデータの追加が原因で発生します。
  • 非繰り返し読み取り- 同じトランザクション内で、同じデータ要求が異なる結果を返します。これは、別の (並列) トランザクションによるデータの変更または削除が原因で発生します。
  • 「ダーティ」読み取り- トランザクションによって追加または変更された、その後ロールバックされないデータの読み取り。
  • 更新の損失- 異なるトランザクションが同じデータ ブロックを同時に変更すると、最後の変更を除くすべての変更が失われます (マルチスレッドにおける「競合状態」と同様)。
便宜上、分離レベルとその機能を表に示します。
断熱レベル ファントムリーディング 繰り返しのない読書 「汚い」読み方 失われたアップデート
シリアル化可能 + + + +
REPEATABLE_READ - + + +
READ_COMMITTED - - + +
READ_UNCOMMITTED - - - +

13. SQL インジェクションとは何ですか?

SQL インジェクションはWeb サイトをハッキングする方法の 1 つであり、その本質はGETクエリPOSTまたは Cookie を通じてデータに SQL コードを挿入することです。Web サイトがこのようなインジェクションを実行すると、データベースにアクセスしてアプリケーションをハッキングする可能性があります。たとえば、ある変数の名前がわかっているとします。column_nametype で言ってみましょうboolean。システムがインジェクションの影響を受けやすい場合は、OR column_name=trueデータベースに必要なものをすべて追加して書き込むことができます。ORは OR 条件を作成し、その後の式は常に となりtrue、さらに先へ進みます。SQL インジェクションのような Web サイトへの攻撃は、SQL クエリで使用される受信データの不適切な処理が原因で発生する可能性があります。JDBCを使用してデータベースに接続する場合は、さまざまな .NET Framework を使用しますStatementsPreparedStatementセキュリティを強化するには、通常のものの代わりに使用する必要がありますStatement。これを使用すると、Statementクエリ文字列と値が単純に加算され、インジェクションが可能になるためです。次に、PreparedStatement特定のリクエスト テンプレートがあり、データは引用符を反映した状態でそこに挿入されます。その結果、SQL インジェクションは、あるフィールドの文字列表現としてのみ認識されます。SQL インジェクションから保護するには、正規表現に基づくチェックを使用できます (正規表現の詳細については、この記事を参照してください)。開発者インタビュー: データベースに関する質問の分析 - 9もう 1 つのオプションは、受信パラメータの文字数に制限を設定することです。たとえば、受信する数値が 9999 を超えない場合は、受信文字数を 4 文字に制限すれば十分です。SQL インジェクションを使用したハッキン​​グのリスクが軽減されます。Java のセキュリティについて詳しくは、「Java のセキュリティ: ベスト プラクティス」の記事をご覧ください。

14. ストアド プロシージャとは何ですか? ストアドファンクション? 引き金?

SQL のストアド プロシージャはデータベース内のエンティティであり、一度コンパイルされてサーバーに保存される一連の SQL 命令です。一言で言えば、これは Java のメソッドに似ています。ストアド プロシージャは、通常のクエリと、通常のクエリでは使用できない一部のアクションの両方で、データに対してアクションを実行できます。プロシージャは、一度作成され、引数を渡すことによって呼び出される SQL エンティティです。このアプローチの利点は、これらの命令を複数回再利用できることです。ストアド プロシージャはパフォーマンスを向上させ、プログラミング機能を強化し、データ セキュリティ機能をサポートします。プロシージャの作成を検討してみましょう。
CREATE PROCEDURE procedure_name (first_param some_type, second_param some_type..)
 begin
……...
 end
プロシージャの呼び出し:
CALL procedure_name (first_param, second_param…..);
ストアド関数はストアド プロシージャの一種です。関数の違いは、プロシージャが常に値のセットを返すのに対し、関数は常に単一の値のみを返すことです。ストアド プロシージャは通常の SQL と混合できませんが、ストアド関数は混合可能であり、これが利点です。一方、ストアド関数にはプロシージャよりも多くの制限があります。ストアド関数の作成:
CREATE FUNCTION function_name (first_param, second_param…..)
RETURNS some_type
 begin
……...
RETURN some_value;
end
ストアド関数の呼び出し:
SELECT function_name(first_param, second_param…..);
トリガーは、ユーザーによって直接呼び出されるのではなく、データが変更されたときにアクティブ化される別のタイプのストアド プロシージャです。つまり、このプロシージャは、指定されたテーブルの特定の列の、 、 、またはINSERTデータなどの特定の条件が満たされたときにアクティブ化されます。トリガーがいつ起動されるかは、キーワード(関連するイベントの前にトリガーが起動) または(イベントの後) を使用して決定されます。 DELETEUPDATEBEFOREAFTER
CREATE TRIGGER trigger_name
ON table_name
AFTER INSERT
 begin
……...
 end

15. 練習

それはともかく、面接で最も一般的な SQL の質問は、問題解決の練習です。すべては相手の想像力の洗練さに依存するため、どのタスクに遭遇するかを推測しようとしても意味はありません。したがって、唯一の有効なオプションは、さまざまな複雑さの SQL クエリをより上手に扱えるようにすることです。sql-ex.ru は、さまざまなタスクを練習するためのリソースとして機能します。最初の 20 個のタスクが完了すると、対話者が SQL タスクであなたを怖がらせることは非常に難しくなります。開発者インタビュー: データベースの質問の分析 - 11今日はここまでです。この記事を読んだ後、データベースに関する疑問や問題が発生しないことを願っています。ご清聴ありがとうございました。またお会いしましょう!
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION