top of page

システムを支えるデータベースとは。筑波大学「データーベース概論Ⅰ」(後編)

  • 執筆者の写真: のろ
    のろ
  • 2024年11月8日
  • 読了時間: 6分

更新日:3月13日

 

目次


はじめに

 

世の中にアプリやシステムが普及し、どんどん便利な社会になっています。システムと聞くとアプリアイコンや画面表示など、UI的な分かりやすい外見に目が行きがちです。しかし、システムにはログやユーザーデータが格納され、適切に管理していくことでその真価を発揮し、ユーザーにとって最適なパフォーマンスを可能にします。目に見えない部分ですが、バックエンドとなる裏側のデータ管理は非常に重要な役割を担っているわけです。では、そのデータ管理を担っている「データベース(DB)」とは一体どのようなものでしょうか。


今回は、2018年にYouTubeで公開されている筑波大学の講義「データベース概論Ⅰ」を視聴しましたので、簡単に概要をまとめてみました。全15講義分の要約でかなりにボリュームになったため、前後半の2つの記事に分けました。どちらもお楽しみください。


本記事では、ITパスポートレベルのITに関する基本的な概念や用語の説明を割愛しています。分からない単語があれば参考サイトのIT用語辞典がすごく便利なので活用してください。また、記事内でのデータベースとは主に「リレーショナルデータベース(RDB)」を指します




データベースの演算子

 

データベースに対して基本的な操作を行うための数学的な枠組みをリレーショナル代数と言います。この考え方を利用し、データベースに格納されたデータに対して様々なアクションを可能とします。リレーショナル代数の代表的な演算子には以下のようなものがあります。これらの演算をSQLを通して実行するイメージです。


①和 :2つの表に存在する全ての行を重複がないように抽出

②差 :一方の表からもう一方の表に存在する行を取り除く

③直積:2つの表に存在する全ての行の組合せ


リレーショナル代数の演算子①

④射影:指定の列を重複がないように抽出

⑤選択:特定の条件にあった行を抽出


リレーショナル代数の演算子②

⑥結合:2つの表で一致する属性値に基づき行を結びつける(直積×選択)


リレーショナル代数の演算子③

⑦商 :組合せの中から条件にあった列を抽出(直積×選択×射影)


リレーショナル代数の演算子④



SQLとは何か

 

SQLは、データベースに対してユーザーが「どんなデータが欲しいか」を伝えるために使用する言語です。あくまでユーザーは「どんなデータが欲しいか」を定義するだけで、「どんな手順で実行するか」はデータベースが自動で最適な方法を決めてくれます。そのため、この演算子とこの演算子を組み合わせて、この手順で実行してくれというような細かい指示を考える必要はありません。


SQLには主に以下の機能があります。

①データ定義:テーブルや主キー等を扱いデータベースを定義するコマンド

②データ操作:データに対して選択/挿入/削除等を実行するコマンド

③データ制御:データベースへのアクセス権限を定義するコマンド

④トランザクション制御:データベースの実行単位であるトランザクションを制御するコマンド




SQLの書き方

 

SQLは国際標準化されているため、一般的なMySQLやPostgreSQL等のDBMSにおいて、独自の拡張や機能があったりしますが、基本的な書き方は統一されています。


SQLで頻繁に登場するSELECT句/FROM句/WHERE句は、書き方はSELECT→FROM→WHEREの順番ですが、読み方としてはFROM→WHERE→SELECTの順番が理解し易いのでおすすめです。


SQLのサンプル①

また、SELECT句には関数を指定できます。COUNT/SUM/NOW/IF等のExcelでもおなじみの関数が用意されており、取得できるデータについてもExcelの関数とほとんど同じと考えて良いでしょう。


SQLのサンプル②



問い合わせ処理の流れ

 

データベースが問い合わせを処理するにあたって、DBMSはユーザーから受け取ったSQLをそのまま理解できないため、実行できる形に変換する必要があります。まずは、SQLの内容をリレーショナル代数の演算子に変換及び分解して、どのような順序でデータ操作を行うか定義します。その後、その操作内容を基に具体的にどのようにデータを操作するかをアクセスステップとして決定します。ここまで完了して、ようやく該当のレコードを取得することができます。


問い合わせ処理の流れ



問い合わせ処理の最適化

 

DBMSは非常に賢く、SQLを効率よく実行できるように自動で最適化してくれます。複数のアクセスステップの中から、最も効率的な方法を勝手に選んでくれるわけです。


最適化の一例として、DBMSは問い合わせを処理する際に、早い段階でデータ量を減らせる方法を優先します。WHERE句や射影等のフィルタリングがある場合、先に実施しておいた方が以降で取り扱うレコード数が減る可能性が高くなります。これにより、処理すべきデータ量が少なくなり、その後の処理負荷を軽減できます。


問い合わせ処理の最適化



レコードの長さ

 

レコードの長さに関しては、固定長の方が管理しやすいため、可変長のレコードは可能な限り避ける設計が推奨されています。可変のカラム構造は管理が複雑なので、固定のカラム構造にすることで、シンプルで一貫性のあるレコードになるためパフォーマンスが向上します。


ECサービスで「お届け先住所」を+-ボタンから複数登録できる場合や、SNSのように投稿毎にタグを複数付ける場合も、表面的にはレコードが可変になっているように思えますが、実際には他の方法で対応しています。基本的に、カラム構造そのものが可変になることはないと考えて良いでしょう。


考えられる対応として、多対多のリレーションを持つテーブル構造を使用することが一般的です。例えば、1つの投稿が複数のタグを持ち、1つのタグが複数の投稿に紐付くようにすることで、柔軟で拡張性の高い設計が可能です。


多対多のテーブル構造

また、JSON型やXML型のカラムを使うことで、1つのカラムに可変長のデータを保持することが可能になり、カラム構造を変更することなく柔軟にデータを保存できます。


JSON型のカラム



ファイルの編成方法

 

データベースで効率的なデータ管理を実現するためには、どのようにレコードを格納するかを決めることが重要です。DBMSはその編成方法に基づいて、問い合わせ処理の最適化を行います。そのため、ユーザーが直接意識することはない領域ですが、設計の段階において非常に重要な要素です。


主なファイルの編成方法には、以下のようなものがあります。

ヒープファイル:挿入は速いが、検索は非効率

ハッシュファイル:検索が高速だが、範囲検索は苦手


データベースのファイル編成①

順次ファイル:並び替え済みなので範囲検索が得意だが、挿入や削除に時間がかかる

索引付ファイル:索引により検索が高速化されるが、索引管理が必要


データベースのファイル編成②

B木/B+木:木構造により効率的な検索・挿入・削除が可能。特にB+木は範囲検索が得意

主索引と二次索引:主索引で一意な検索を効率化し、二次索引で柔軟な検索が可能


データベースのファイル編成③



さいごに

 

今回の説明では、データベースに保存されたデータへのアクセス方法や、理想的なデータ管理について解説しました。前回の記事と合わせて、データベースとは何なのか概要は掴めたんじゃないでしょうか。システムを構築する上で、データの存在は欠かせません。データベースを使用しないシステムにおいても、データを効率的に管理するにあたって、これらの知見は決して無駄にならないと思います。


久しぶりの大学の講義を1学期分視聴したので、なんだか学生に戻ったみたいでした。社会に出てみると、大学の先生のように特定の専門分野に精通した方に出会う機会は意外と少ないです。いま学生の皆さんは、ゼミや研究室といった専門家と近い距離で交流できる貴重な場があると思います。そこで得た専門的な知識や経験は、社会でも大いに通用しますので、是非活用してみてください。




参考サイト

 
bottom of page