テクノロジ系データベース出題頻度 ★★★

関係データベースと主キー

データを表の形で管理する関係データベースの基本を、学校の名簿とクラス表の例えと図で解説。行・列・主キー・複合主キー・外部キー・参照整合性の意味がわかり、どの列を主キーにすべきかを判断する問題が解けるようになります。

この単元の用語:データベース / DBMS / 関係データベース / レコード / フィールド / 主キー / 複合主キー / 外部キー / 参照整合性 / インデックス

データベースって、エクセルの表とは何が違うんですか?

見た目はよく似た表なんだけど、大量のデータを、たくさんの人が、矛盾なく使えるようにルールで守られているのがデータベースなんだ。学校の名簿で考えてみよう。

データベースとDBMS

データベース は、たくさんのデータを決まった形で整理し、検索や更新をしやすくしたデータの集まりです。ネットショップの会員情報、銀行の口座残高、図書館の蔵書目録などがデータベースで管理されています。

データベースを管理するソフトウェアを DBMS(データベース管理システム)といいます。DBMSは次のような仕事をします。

  • データの 登録・検索・更新・削除 を受け付ける
  • 複数の人が同時に更新しても矛盾しないように制御する(排他制御)
  • 障害が起きたときに元の状態に戻す(障害回復)
  • 利用者ごとに見られるデータを制限する(アクセス権の管理)

関係データベース:データを「表」で管理する

データを 行と列からなる表 で表すデータベースを 関係データベース(リレーショナルデータベース、RDB)といいます。現在もっとも広く使われている方式です。

生徒番号🔑 氏名 クラス S001 青木 花 1組 S002 伊藤 翔 2組 S003 青木 花 1組 ← 行 (レコード)1人分 ↙ 列 (フィールド)項目 同姓同名がいても、生徒番号なら1人に決まる → 生徒番号が主キー
横の1行が1件分のデータ、縦の1列が項目。主キーは行を見分ける「背番号」
呼び方意味別名
表データ全体の入れ物テーブル、関係(リレーション)
行1件分のデータ(生徒1人分)レコード、タプル
列データの項目(氏名、クラスなど)フィールド、属性

主キー:行を1つに決める「背番号」

上の図には「青木 花」さんが2人います。氏名では、どちらの青木さんかわかりません。そこで、表の中で行を1つに特定できる列 を決めておきます。これが 主キー です。

主キーの条件

  1. 値が 重複しない(一意性)
  2. 値が 空(NULL)でない

身近な主キー

  • 学校の 生徒番号、会社の 社員番号
  • 図書館の 蔵書番号(同じ本が2冊あっても番号は別)
  • ネットショップの 注文番号

逆に、氏名・生年月日・住所 は同じ人がいる可能性があるので、主キーには向きません。

複合主キー

1つの列だけでは行を特定できないとき、複数の列を組み合わせて 主キーにできます。これを 複合主キー(連結キー)といいます。

例えば成績表で「生徒番号」だけだと、同じ生徒が国語・数学…と複数行あって重複します。「生徒番号 + 科目」 の組なら1行に決まります。

外部キー:表と表をつなぐ

関係データベースでは、データを複数の表に分けて、共通の列 で結び付けます。他の表の主キーを参照する列を 外部キー といいます。

生徒表 生徒番号🔑 氏名 クラス S001 青木 花 1組 S002 伊藤 翔 2組 クラスは外部キー クラス表 クラス🔑 担任 1組 田中先生 2組 中村先生 参照 ✕「クラス=9組」の生徒を追加 → クラス表に9組がないので拒否 (参照整合性制約)
生徒表の「クラス」から、クラス表の主キー「クラス」をたどれば担任がわかる

担任の名前を生徒1人ずつに書くと、担任が替わったときに全員分を直す必要があります。表を分けて外部キーでつなげば、クラス表の1か所を直すだけ で済みます。

外部キーには、参照先の表に実在する値しか入れられない というルールがあります。これを 参照整合性制約 といいます。存在しない「9組」の生徒を登録したり、生徒が所属している「1組」をクラス表から削除したりする操作は、DBMSによって拒否されます(設定によっては関連する行も一緒に削除・更新されます)。

主キーと外部キー、名前は似ているけど役割が違うんですね。

そう。主キーは自分の表の中で行を見分けるもの、外部キーはよその表の主キーを指さすもの。外部キーの値は重複してもいいんだ。1組の生徒はたくさんいるからね。

主キー外部キー
役割自分の表の行を1つに特定他の表の主キーを参照し、表どうしを関連付ける
重複不可可(同じクラスの生徒が複数いる)
空(NULL)不可DBMSの設定による
守るルール一意性制約・NOT NULL制約参照整合性制約

インデックス:検索を速くする索引

データが何百万件もあると、端から順に探すのは時間がかかります。そこで、よく検索に使う列に インデックス(索引)を作っておくと、本の巻末の索引のように目的の行をすぐに見つけられます。ただし、データを更新するたびにインデックスも更新されるため、作りすぎると更新処理が遅くなります。

試験に出るポイント

  • DBMS はデータベースを管理するソフト(排他制御、障害回復、アクセス権の管理)
  • 関係データベースは 表(テーブル) で管理。行=レコード、列=フィールド
  • 主キー:行を一意に特定。重複不可・NULL不可。複数列の組なら 複合主キー
  • 外部キー:他の表の主キーを参照。値は重複してよい
  • 参照整合性制約:参照先に存在しない値の登録や、参照されている行の削除を防ぐ
  • インデックス:検索を速くする索引

確認クイズ

選択肢をタップすると、すぐに正解と解説が表示されます。

Q1関係データベースの主キーに関する記述として、適切なものはどれか。

Q2次の「受注明細」表で、行を一意に特定するための主キーとして最も適切なものはどれか。

受注番号|商品番号|数量
1001|A01|2
1001|B02|1
1002|A01|5
1003|B02|1

Q3「社員」表の部署コードは、「部署」表の主キーである部署コードを参照する外部キーである。参照整合性制約によって拒否される操作はどれか。

Q4データベースで、特定の列を使った検索を速くするために作成するものはどれか。