梯はしこです。

 

昨日の深夜に8章の解説部分をさらりと読んで、今朝章末問題を解きましたニコニコ

 

その結果。

 

16問中12問正解…びっくりマーク

 

相変わらず正答率が低いのですネガティブ

 

8章はページ数が多いなと思っていたのですが、業務で経験したことも多かったので、

 

いけるいけるグラサンハート

 

とサクサク進んでいたら、甘かった…魂が抜ける

 

さっそく復習していきます。

 

 

  8章の概要

8章のタイトルは、スキーマオブジェクトの管理。

 

スキーマとは何か?という説明から始まって、その後は表のデータ型や制約の話。さらに表の作成・削除と進み、これまで何度も登場した「索引」とビューの解説。

 

7章まではデータベース管理者よりのお話でしたが、8章はアプリケーション開発側のお話だなと思いました。

 

(一応)システムエンジニアである私は、がっつりかかわる部分汗うさぎ

 

Bronze試験以前に、仕事をする上で知っておかねばならないことばかり。

 

しっかり復習していきますニコニコ

 

 

 スキーマとは

表や索引などのオブジェクトは、作成したユーザーの所有者として紐づきます。

 

ユーザーを作成したとき、ユーザー名と同じ名前のスキーマなるものも同時に作成されます。

 

たとえばキツネユーザーを作成する場合。

 

キツネユーザーを作成すると、同時にキツネスキーマが作成されます。

 

そしてそのキツネユーザーが表を作ったとき、その表はキツネスキーマに格納される仕組みです。

 

 

スキーマには名前空間としての役割があります。

 

たとえば「キツネ」くんのお道具箱と「タヌキ」くんのお道具箱には、同じように「のり」と「はさみ」が入っています。

 

どちらも同じ「のり」と「はさみ」で、お道具箱から出してしまえば誰のものかわかりません。

 

しかし「キツネ」くんのお道具箱に入っている「のり」や「はさみ」はキツネくんのものです。わざわざ「のり」や「はさみ」に名前を書いておかなくても、きちんと区別できますね。

 

 

話は変わって、ここで1つ疑問が。

 

今まで勉強してきた「表領域」はどこに行ったのはてなマーク

 

オブジェクトの格納先に指定する場所が表領域。

 

ちなみに表領域の実態がデータファイル。

 

ユーザー所有のオブジェクトを格納するのがユーザーのスキーマ。

 

ややこしや。

 

chatGPTに聞いてみましたよ。

 

質問内容。

 

Oracleデータベースにおける表領域とスキーマの違いを教えてください。 表領域の中にスキーマがあるイメージで良いですか。

 

いただいた回答はかなり長いので一部省略しますが、このような内容。

 

Oracleデータベースにおける「表領域」と「スキーマ」は、異なるコンセプトであり、それぞれ異なる役割を果たします。

 

(略)

 

表領域は、Oracleデータベースにおける物理的なデータの格納領域を管理するための概念です。

 

データファイルは表領域ごとに割り当てられ、データオブジェクトはそれらのデータファイル内に格納されます。

 

(略)

 

スキーマは論理的な構造であり、物理的なデータの格納場所ではありません。スキーマ内のデータオブジェクトは、対応する表領域に格納されます。

 

要するに、表領域はデータベースの物理的なデータの配置を管理し、スキーマはデータベース内でデータオブジェクトを論理的にグループ化するための名前空間です。

 

表領域内にスキーマがあるというイメージは、スキーマ内のデータオブジェクトが特定の表領域に配置されることを意味しますが、それらは異なるコンセプトであり、別々に管理されます。

 

引用:chatGPT(一部省略)

 

ちょっと難しいですね。

 

表領域は実態であるデータファイルとの紐づき(配置)を管理して、スキーマはあくまでも「このオブジェクトは誰のもの」というものを管理する、ということでしょうかキョロキョロ

 

 制約について

表に格納するデータについて、

 

こういうデータを入れたらダメよ注意

 

という制限をするために、表の列または列の組み合わせに対して、制約を設けることがあります。

 

  • NOT NULL制約
  • UNIQUE制約
  • PRIMARY KEY制約
  • FOREIGN KEY制約
  • CHECK制約

 

 

NOT NULL制約

NOT NULL制約は、「NULLのデータは入れちゃダメよ」というもの。わかりやすい。
 

 

 

UNIQUE制約

UNIQUE制約は、一意キー制約とも呼び、表の列または列の組み合わせに対して、重複することを許さない注意というものになります。
 
UNIQUE制約の間違いやすいところは、
 
別にNULLは入ってもOK
 
というところ。
 
値が入っていて重複するのはNGですが、NULLが入ることに対しては寛容なのです。

 

 
PRIMARY KEY制約
重複を許さず、さらにNULLも許さず。
 
そういう厳しい制約が、PRIMARY KEY制約。またの名を主キー制約と呼びます。
 
表の列または列の組み合わせに対して、重複しておらず、かつNULLでもないことを保証してくれます。
 
その結果何が起こるかと言うと、PRIMARY KEYを指定すれば、1件のデータまで絞れるということ。
 
そして1つの表に対して設定できるPRIMARY KEYは1つだけ、という決まりがあります。
 
 
複数の列に対して、それぞれPRIMARY KEYを設定するのはNGです。
 
 
このように、名前と番号それぞれにPRIMARY KEYを設定することはできません。
 
 
名前と電話番号の組み合わせを1つのPRIMARY KEYにすることはOKです。
 
たとえば上の例であれば、フォ吉とタヌオの電話番号が同じです。
 
ルームシェアなどをしていて、家の電話番号が同じということにしておきましょう。
 
電話番号だけをPRIMARY KEYとすると、重複しているので成り立ちませんが、名前とセットにすることで、フォ吉とタヌオを区別することができます。

 

注意実際には名前や電話番号をPRIMARY KEYに設定することはあまりよろしくありません。本来であれば最初の例のように絶対に一意になる「番号」などの列を作成し、それを主キーにするのがよろしいかと。

 

 

 

 

 

FOREIGN KEY制約

FOREIGN KEY制約は外部キー制約とも呼ばれます。

 

リレーショナルデータベースは、その名の通り関連する表と表が紐づく構造になっています。

 

関連する表と表を紐づけるために登場するのが、FOREIGN KEY制約です。

 

FOREIGN KEY制約を設定することで、関連するほかの表のデータに対応していることがわかります。

 

たとえばこういう社員表があったとして。

 

 

これだけだと、社員たちがどこの部署に属しているのかよくわかりませんね。

 

そこで、部署表を見てみましょう。

 

 

部署表を見ることで、部署コード01番のタヌオは総務部、02番のはしことフォ吉は開発部に属していることがわかります。

 

社員表の部署コードのように、

 

関連する表の列がキーになっていますよ

 

というのがFOREIGN KEY(外部キー)です。

 

部署表の部署コードのように、

 

関連する表から見られていますよ

 

というキーのことを参照キーと呼びます。

 

また、社員表のように外部キーを持つ表のことを「子表」、部署表のように参照キーを持つ表を「親表」と呼びます。

 

 

子表は親表に従っています。

 

たとえば、新しい社員に「ピンク先生」が加わったとしましょう。

 

彼は社員教育をする「教育部」という新設された部署に所属してもらいたいと思っています。

 

さっそく社員表にピンク先生を追加。社員表の部署コードを04に設定して…

 

というのはNGです。

 

子表の外部キーには親表に存在する値しか入れることができません。

 

つまりこの場合、先に親表である部署表に部署コード04の教育部を追加してから、子表である社員表にピンク先生を追加することになります。

 

と、いうことは。

 

部署表に部署コード01の行が複数存在していたり(重複)、部署コード02の行を削除してしまったりしたらどうなるでしょう。

 

社員表の部署コード01がどの部署を指し示しているのかわからなくなりますね。部署コード02が親表に存在しないというのもまずい汗うさぎ

 

そこで、参照キーにはUNIQUE制約またはPRIMARY KEY制約を設定する必要があります。これにより親表の重複問題は解決。

 

参照キーの更新やデータの削除などを実行したときには、エラーが発生します。親表に値がない問題は発生しないというわけですね。

 

 

CHECK制約

個人的にあまり馴染みがなかったのがCHECK制約。

 

指定した条件を満たす値を入れるようにするのがCHECK制約です。

 

つまり具体的に「NULLはダメ」とか「一意でなければダメ」とかいうものではなく、表を作成するユーザーが独自に作成できる制約ということですね。

 

たとえば

 

  • メールアドレスは「@」が入っていないとダメ
  • 郵便番号は7桁ぴったりでないとダメ
  • 商品価格は100円以上でなければダメ
などなど。

 

 

  所感

8章はまだまだありますが、長くなってしまったのでいったんこの辺で区切りといたします。

 

残りは

 

  • 表の削除
  • 索引とビュー
  • データ作成のためのツール
などを確認して、間違えた問題の復習をおこなっていく予定ですニコニコ