APのべんきょう

APを受けるのでノートを作ります.ビギナー向けでは無いです.

SQL <前編>

SQL

前回はデータベースの正規化の話をしましたが,次はSQLの話を2つの記事に分けてしていきます.

前半の記事では,SQLの基本的な構文を紹介します.

SQL(Structured Query Language)は,データベースの定義や操作を実行するために用いられます.

目次

1.SELECT

2.DISTICNT

3.集合関数

4.FROM

5.WHERE

6.GROUP BY

7.HAVING

8.ORDER BY

9.UNION,INTERSECT,EXCEPT

1. SELECT

SELECTの後に列名を指定することでその列のデータのみがその順番通りに抽出されます.

ちなみに,このように指定した列名のデータのみを抽出することを射影といいます.

1.1. SELECT "列名1","列名2",...

"列名1", "列名2", ...と複数の列を抽出できます.

例1(表1参照)
SELECT 学籍番号,氏名

FROM 学生

f:id:chankilu23:20201231141452j:plain

1.2. SELECT "列名" AS "新列名"

"列名"のデータを,"新列名"を新たな列名として抽出します.

例2(表2参照)
SELECT 学籍番号,氏名 AS 名前

FROM 学生

f:id:chankilu23:20201231141750j:plain

1.3. SELECT *

FROM句で指定したテーブルの全ての列が抽出されます.

例3(表3参照)
SELECT *

FROM 学生

f:id:chankilu23:20201231141805j:plain

1.4. SELECT * FROM "表名1", "表名2", ...

SELECTで*と指定し,FROM句で表を指定すると,指定した表の値の全ての組み合わせが抽出されます.

これを直積といいます.

例4(表4参照)
SELECT *

FROM 学生,学部

f:id:chankilu23:20210102121318j:plain

目次へ

2. DISTINCT

distinctとは,ここでは「区別ができる」というような意味で,DISTINCTは射影したときに行を重複させずに出力します.

DISTINCTがないとどうなるのか見てみます.

例5(表5参照)
SELECT 所属サークル

FROM 学生

f:id:chankilu23:20210101174725j:plain

赤字で示したように,軽音とダンスが重複して表示されています.

一方で,SELECTの直後でDISTINCTを指定してみます.

例6(表6参照)
SELECT DISTINCT 所属サークル

FROM 学生

f:id:chankilu23:20210101174741j:plain

重複していた軽音とダンスは 1行しか表示されていません.

トップへ

3. 集合関数

3.1. MAX, MIN

それぞれ最大値(maximum)と最小値(minimum)を求めます.

SELECTの後にMAX("列名")を指定すると,"列名"の値における最大値が得られます.

MIN("列名")を指定すると,"列名"の値における最小値が得られます.

先ほどのSELECT ASと合わせることで以下のようになります.

例7(表7参照)
SELECT MAX(成績) AS 成績の最大,MIN(成績) AS 成績の最小

FROM 学生

f:id:chankilu23:20210102123043j:plain

3.2. AVG

平均(average)を求めます.

NULLがあった(値が登録されていない)ときはその行は無いものとして計算します.

下の例では,

 \dfrac{48+65+73+99+54+44}{6}

を計算します.

例8(表8参照)
SELECT AVG(成績) AS 成績の平均

FROM 学生

f:id:chankilu23:20210102123127j:plain

3.3. SUM

和(summation)を求めます.

NULLがあったときはAVGと同様にその行は無いものとして計算します.

例9(表9参照)
SELECT SUM(成績) AS 成績の和

FROM 学生

f:id:chankilu23:20210102123139j:plain

3.4. COUNT

行の数を求めます(count).

COUNT(*)と指定すると,全ての行数がカウントされます.

COUNT("列名")と指定すると,"列名"のNULL以外がカウントされます.

例えば,体調不良などで試験を欠席した人以外を数えるときは以下のようにするといいでしょう.

例10(表10参照)
SELECT COUNT(*) AS 合計人数,COUNT(成績) AS 受験人数

FROM 学生

f:id:chankilu23:20210102123150j:plain

トップへ

4. FROM

FROM句では,データを抽出するテーブル名であったりビュー名を指定します.

例4で見たようにFROM句では複数の表を指定できます.

また,相関名という概念があります.

相関名とは,テーブル名につけた別の名前のことです.

下の例では,ASで相関名をXとしています.

ただし,相関名を指定したときは,列名は"相関名.列名"で指定します.

例11(表11参照)
SELECT X.学籍番号,X.氏名

FROM 学生 AS X

f:id:chankilu23:20210103152815j:plain

トップへ

5. WHERE

WHERE句の後に条件を指定することによって,その条件を満たす行のみを抽出します.

条件に合う行を取り出すことを選択といいます.

条件には抽出条件と結合条件があります.

5.1. 抽出条件

抽出条件に用いる演算子として,比較演算子や論理演算子などがあります.

5.1.1. 比較演算子

比較演算子には6種類あり,それぞれ次のような意味を持っています.

f:id:chankilu23:20210103160800j:plain:w1500

ここでは,>=の例だけ挙げておきます.

例12(表12参照)
SELECT *

FROM 学生
WHERE 成績 >= 65

f:id:chankilu23:20210103203449j:plain

5.1.2. 論理演算子

AND演算子

WHEREの後に,"条件1" AND "条件2" と指定すると,"条件1"と"条件2"が共に真であるような行が抽出されます.

ただし,NULLのある行は無条件に抽出しません.

例13(表13参照)
SELECT *

FROM 学生
WHERE 学籍番号 < 0005 AND 成績 >= 65

f:id:chankilu23:20210104153117j:plain

OR演算子

WHEREの後に,"条件1" OR "条件2" と指定すると,"条件1"と"条件2"のうち少なくとも一方が真であるような行が抽出されます.

ただし,NULLのある行は無条件に抽出しません.

例14(表14参照)
SELECT *

FROM 学生
WHERE 学籍番号 < 0005 OR 成績 >= 65

f:id:chankilu23:20210104153134j:plain

NOT演算子

WHEREの後に,NOT "条件1" と指定すると,"条件1"が偽であるような行が抽出されます.

ただし,NULLのある行は無条件に抽出しません.

例15(表15参照)
SELECT *

FROM 学生
WHERE NOT 成績 = 65

f:id:chankilu23:20210104180132j:plain

5.1.3. その他

IN()演算子

WHEREの後に,"列名" IN ("値1", "値2", ....)と指定すると,"列名"が"値1", "値2", ...に一致するような行が抽出されます.

ただし,NULLのある行は無条件に抽出しません.

例16(表16参照)
SELECT *

FROM 学生
WHERE 成績 IN (44, 46, 48)

f:id:chankilu23:20210104162744j:plain

BETWEEN AND演算子

WHEREの後に,"列名" BETWEEN "値1" AND "値2" と指定すると,"列名"の値が"値1"以上"値2"以下であるような行が抽出されます.

例17(表17参照)
SELECT *

FROM 学生
WHERE 成績 BETWEEN 48 AND 72

f:id:chankilu23:20210104175435j:plain

IS NULL演算子

WHEREの後に,"列名" IS NULLと指定すると,"列名"の値がNULLであるような行が抽出されます.

例18(表18参照)
SELECT *

FROM 学生
WHERE 成績 IS NULL

f:id:chankilu23:20210104175448j:plain

IS NOT NULL演算子

WHEREの後に,"列名" IS NOT NULLと指定すると"列名"の値がNULLでないような行が抽出されます.

例19(表19参照)
SELECT *

FROM 学生
WHERE 成績 IS NOT NULL

f:id:chankilu23:20210104175500j:plain

LIKE演算子

文字列の検索に使います.

WHEREの後に,"列名" '文字列検索条件'と指定すると,"列名"の値がその文字列検索条件を満たす行を抽出します.

文字列検索条件に用いるのは

%:0文字以上の任意の文字列

_:1文字以上の任意の文字列

があります.

以下に4つ例を出します.

例20 前方一致検索 (表20参照)
SELECT *

FROM 学生
WHERE 氏名 LIKE '中%'

f:id:chankilu23:20210105102649j:plain

例21 後方一致検索 (表21参照)
SELECT *

FROM 学生
WHERE 氏名 LIKE '%花'

f:id:chankilu23:20210105104353j:plain

例22 中間一致検索1 (表22参照)
SELECT *

FROM 学生
WHERE 氏名 LIKE '%中%'

%は任意の0文字分なので,この例22では先頭が"中"でもOKです.

f:id:chankilu23:20210105104414j:plain

例23 中間一致検索2 (表23参照)
SELECT *

FROM 学生
WHERE 氏名 LIKE '_中%%'

アンダースコア"_"は任意の1文字分なので,この例23では2文字目が"中"である,という条件であることに注意します.

f:id:chankilu23:20210107165029j:plain

5.2 結合条件

結合条件とは,指定された2つの列の値が同じ行を抽出する条件です.

例24(表24参照)
SELECT *

FROM 学生,学部
WHERE 所属学部コード = 学部コード

f:id:chankilu23:20210105153216j:plain

下の例25のように,違う表で列名が同じ場合は,"表名.列名"のように指定します.

例25(表25参照)
SELECT *

FROM 学生,学部
WHERE 学生.学部コード = 学部.学部コード

f:id:chankilu23:20210105153236j:plain

下の例26のように,相関名を用いることもできます.

例26(表26参照)
SELECT *

FROM 学生 A,学部 B
WHERE A.学部コード = B.学部コード

f:id:chankilu23:20210105153256j:plain

トップへ

6. GROUP BY

GROUP BY句は,指定した列の値が同じ行をグループ化します.

普通は集合関数と一緒に使います.

また制約があり,SELECTの後に指定する項目は

・GROUP BY句の後にした列名

・集合関数

のどちらかでないといけません.


下の例27は,学部ごとの成績の平均を抽出したものです.

例27(表27参照)
SELECT 学部名 AVG(成績)

FROM 学生,学部
WHERE 学生.学部コード = 学部.学部コード
GROUP BY 学部名

f:id:chankilu23:20210105153732j:plain

トップへ

7. HAVING

HAVING句では,GROUP BY句でグループ化した後の行に対する条件を指定します.

また制約があり,HAVINGの後に指定する抽出条件は

・GROUP BY句で指定した列名

・集合関数

のどちらかでないといけません.

例28(表28参照)
SELECT 学部名 AVG(成績)

FROM 学生,学部
WHERE 学生.学部コード = 学部.学部コード
GROUP BY 学部名
HAVING AVG(成績) > 80

f:id:chankilu23:20210105161038j:plain

トップへ

8. ORDER BY

ORDER BY句は,指定した列に関して,抽出した行を昇順または降順にソート(並び替え)します.

昇順ではASC(ascending)を指定し,降順ではDESC(descending)を指定します.

何も指定しない場合は,ASCがデフォルトで指定されます.

複数の列に関してソートすることも可能で,優先順位の高い順に

ORDER BY "列名1", "列名2", ...

とすればよいです.

例29(表29参照)
SELECT *

FROM 学生
ORDER BY 学部コード,成績

f:id:chankilu23:20210107145755j:plain

ORDER BY の後に整数 nを指定すると,SELECTで指定した列のうち n番目の列を指定することができます.

例30(表30参照)
SELECT 学部コード,AVG(成績)

FROM 学生
GROUP BY 学部コード
ORDER BY 2 DESC

f:id:chankilu23:20210107165715j:plain

トップへ

9.UNION,INTERSECT,EXCEPT

数学でいう和集合,共通部分,差集合に対応する演算子です.

これらの演算子を使うときには,SELECTで指定した表の列名や列の構成が同じである必要があります.

そこまで頻出ではないようなのでサラッと紹介だけします.

9.1. UNION

2つの表のうち,少なくとも一方に属する行を抽出します.

ALLを付けると,重複行は取り除かれません.

ALLを付けなければ,重複行は取り除かれます.

例31(表31参照)
SELECT * FROM 工学部生

UNION ALL

SELECT * FROM ダンス部

f:id:chankilu23:20210107154357j:plain

9.2 INTERSECT

2つの表に共に属する行を抽出します.

例32(表32参照)
SELECT * FROM 工学部生

INTERSECT

SELECT * FROM ダンス部

f:id:chankilu23:20210107154412j:plain

9.3 EXCEPT

先に指定した表に属する行のうち,後に指定した表に属する行を取り除きます.

例33(表33参照)
SELECT * FROM 工学部生

EXCEPT

SELECT * FROM ダンス部

f:id:chankilu23:20210107170025j:plain


基本的なSQLの構文を解説しました.

後半の記事ではデータ定義言語や副問合せなどの話をします.

ふぅ,疲れた.

参考:金子則彦「データベーススペシャリスト合格教本」,アイテックIT人材教育研究部(2020)「2021応用情報・高度共通 午前試験対策書」

正規化

正規化

まずは用語をいくつか定義します.

表中のタプルを一意に決定することのできる属性を主キーといいます.

つまり,表中に主キーの値が同じ行が複数存在することはありません.複数存在すればタプルを一意に決定できないためです.

下の表1では,学籍番号が主キーになります.その他の属性の値を1つ決めてもタプルは一意に決まるとは限りません.

例えば,学部が農学部という指定をしたところで0004の田中さんと0007の宮地さんの2人がいて一意にタプルは定まっていません.

f:id:chankilu23:20201217130107j:plain

表中に主キーの役割を果たす属性が複数存在することもあって,これを主キーの候補という意味で候補キーといいます.

候補キーの中から主キーを1つ選びますが,選ばなかった候補キーのことを主キーの代わりができるぞという意味で代替キーといいます.

上の表1において,住所が同じ人がいないと仮定するなら住所も主キーになりえます.

つまり,学籍番号と住所は候補キーですが,主キーとして学籍番号を選ぶなら住所は代替キーです.


候補キーに求められる性質で,表中に同じ値を持つ行が複数存在しないというものをユニーク制約といいます.

また,主キーに求められる性質で,主キーの値にNULL値を持つことができないというものを非NULL制約といいます.


また,単独の属性でタプルを一意に決定できないときは複数の属性を組み合わせたものを候補キーとしますが,これを複合キーといいます.

ここで,候補キーには極小という性質が求められます.極小とは簡単に言えば必要最低限という意味です.

上の例で学籍番号と住所は候補キーでしたので,当然学籍番号と住所を組み合わせたものでもタプルを一意に決定できます.

しかしこれは候補キーの極小という性質を満たしていないので候補キーにはなりえません.

日本語が難しいですが,{学籍番号}や{住所}は候補キー,{学籍番号,住所}は候補キーでない,と書くと少しスッキリしそうです.


属性Aの値が決まると属性Bの値も1つに決まるとき,属性Bは属性Aに関数従属するといいます.

主キー以外の属性は必ず主キーに関数従属することがわかると思います.

上の表1では,例えば氏名は学籍番号に関数従属します.


外部キーとは,その値によって他の表のタプルを一意に決定できる属性のことです.

外部キーにおいては,参照先との間に参照制約という制約が発生します.

大まかには以下の2つの利点があります.

・参照先に存在しないような値を持つものは参照元の表に登録できない

・参照している行を参照先の行から削除できない

外部キーについては記事の最後で具体例を使って確認します.

第1正規化

第1正規化では繰り返し属性というのがキーワードになります.

繰り返し属性を持つとは,1つの属性が複数の値を持った状態を指し,下の表2のような状態です.

f:id:chankilu23:20201217130239j:plain

0004の田中さんと0006の橋本さんを見ると,所属サークルが繰り返し属性になっているのがわかります.

このような状態から,値ごとに行を分けて下表のような状態にする操作を第1正規化といいます.

f:id:chankilu23:20201217130324j:plain

そして,第1正規化を行い繰り返し属性を排除した表の形式を第1正規形といいます.

それに対し,繰り返し属性を持つような表の形式を非正規形といいます.

当然ですが,全ての表が非正規形であるとは限らず,初期状態が既に第1正規形である表もあります.

第2正規化

第2正規化では部分関数従属というのがキーワードです.

部分関数従属とは,主キーのうち一部分のみに関数従属することです.

表のうち,部分関数従属している属性のみを別の表に分割する操作を第2正規化といいます.

そして,第2正規化を行い主キーに部分関数従属する属性を排除した表の形式を第2正規形といいます.


上の表3では,主キーは{学籍番号,所属サークル}です.

学籍番号だけではタプルを一意に決定できないことに注意してください.

このとき,氏名,学部,学部コードは主キー{学籍番号,所属サークル}のうち学籍番号のみに関数従属しています.

これは第2正規形に反しているので,そこだけ別表に切り取り,下の表4のようになります.

f:id:chankilu23:20201217130413j:plain

第3正規化

第3正規化では推移的関数従属というのがキーワードです.

推移的関数従属とは,その名の通り関数従属の関係が推移的に辿れるものです.

例えば,上の表4では学籍番号が決まると学部が一意に決まります.そして学部が決まると学部コードも一意に決まります.

つまり,学籍番号  \to 学部  \to 学部コードの順に推移的な関数従属があることがわかります.

このような関係を別表に切り出して下の表5のようにすればOKです.

f:id:chankilu23:20201217130441j:plain

ここで,初めに紹介した外部キーを思い出してみましょう.

以下の表6のようにそれぞれエンティティ名をつけておきます.

f:id:chankilu23:20201217192503j:plain

学生エンティティでは学部が外部キーになります.

実際,学生エンティティの学部が1つ決まれば学部エンティティのタプルが一意に定まります.

さらに外部キーの参照制約を確認してみます.

学部エンティティにない法学部に所属する学生を学生エンティティに追加することはできません.

また,学部エンティティの工学部は学生エンティティで使用されているので,学部エンティティから工学部という値は削除できません.


正規化の話はこんなかんじです.

次はSQLの話です.

SQLはほとんど知識がないので更新にさらに時間がかかるかもしれないです.

参考:アイテックIT人材教育研究部(2020)「2021応用情報・高度共通 午前試験対策書」

データモデル

これからはしばらくデータベースの話をまとめていきます.

データモデル

データベースには色んなデータが格納され,データ間で依存関係を持つものも存在します.

どんなデータが格納されているとか,このデータ間にはこんな関係がある,というのを図式化して整理したものをデータモデルといいます.

データモデルには,概念データモデル論理データモデルがあります.

DBMS(DataBase Management System)の型を無視してデータ関係を表現するのが概念データモデル,DBMSの型を無視してデータ関係を表現するのが論理データモデルらしいです.(何言ってるかわからない)

概念データモデル

エンティティ(entity)と,エンティティ同士のリレーションシップ(relationship)によってデータやデータ集合の構造を表すモデルがE-Rモデルで,概念データモデルの一つです.


エンティティ

データの項目を属性と呼び,属性の集合をエンティティと呼びます.

例えば,学籍番号,学生氏名,講義コード,講義名,講義区分,という5つの項目があるとすると,それぞれを属性といいます.

そして,{学籍番号,学生氏名}をまとめて「学生」,{講義コード,講義名,講義区分}をまとめて「講義」という情報として扱うとします.

新しくまとまりとして名前をつけたこの「学生」や「講義」がエンティティです.


リレーションシップ

エンティティとして上に書いたような学生,講義があるとします.

そして学生と講義の間に,学生が講義を「履修する」という関係があったとき,この「履修する」というのがリレーションシップです.

リレーションシップは一つとは限らず,例えば学生と講義の間の「単位を取得した」とかもリレーションシップになりそうです.


さらに,各属性に具体的な値を持たせたものをインスタンスといいます.

例えば上の学生と講義のエンティティにおいて,(0001, アリス)や(1000, ボブ)は学生エンティティのインスタンスです.

同様に,(07, 英語基礎, 一般教養)や(85, データベース論, 専門科目)は講義エンティティのインスタンスです.

E-R図

E-Rモデルを図として表したのがE-R図です.

最近ではバックマン線図UMLクラス図が使われているみたいです.

(UML:Unified Modeling Language)

この2つは後述します.


さらにエンティティ間のリレーションシップに関してカーディナリティという概念があります.

カーディナリティは多重度とも言われ,その名の通りリレーションシップにおける対応が多重になっているかどうかです.

先ほどの学生と講義のエンティティにおいて,1人の学生は普通は多数の講義を履修しますし,1つの講義は普通多数の学生から履修されます.

よって「履修する」というリレーションシップの多重度は多対多です.

次に,教員エンティティ{教員番号,教員氏名}と講義エンティティのリレーションシップ「担当する」を考えます.

1つの講義は1人の教員によって担当されるとします.

このとき,1人の教員は複数の講義を担当することはあるかもしれませんが,1つの講義は1人の教員に担当されます.

よって「担当する」の多重度は1対多です.


バックマン線図

1対多という多重度において,「1」を直線,「多」を矢印で表します.(下図参照)

シンプルで図はごちゃごちゃしませんが,ぱっと見で意味がわかりにくいという特徴があります.

学生,講義,教員のエンティティ間のリレーションシップと多重度をバックマン線図で整理してみます.

f:id:chankilu23:20201205130835j:plain

UMLクラス図

バックマン線図に比べて,「多」をより厳密に表現していて,多重度の最小値と最大値を明確に図中に示します.

例えば,最小で3,最大で5のときは「3...5」と書きます.

最小が1で,上限はないような場合は「1...*」と書きます.

学生,講義,教員のエンティティ間のリレーションシップと多重度をUMLクラス図で整理してみます.

f:id:chankilu23:20201205170844j:plain

この例では以下のことが読み取れます.

・1人の学生は5個以上20個以下の講義を履修している

・1つの講義は1人以上の学生が履修している

(1人の教員は0個以上の講義を担当している)

・1つの講義につき担当教員は1人である

3つ目はそれはそうってかんじなのでカッコにしておきました.

論理データモデル

論理データモデルには大きく階層型ネットワーク型関係型の3種類があります.

E-R図ではエンティティというものが出てきましたが,論理データモデルにおいてエンティティに対応するのはレコードとよびます.

階層型データモデル

レコード間のリレーションシップを親子関係で表すのが階層型の特徴です.

子レコードは親レコードを1つしか持てず,複数の親を持たせたいときはそれぞれの親に別の子としてレコードを追加する必要があります.

下の例では,子Bを親1と親3に2回登録しています.

子Eを飛ばしたのはミスではなくわざとです.(ほんまか??)

f:id:chankilu23:20201205202754j:plain

ネットワーク型データモデル

階層型の拡張で,子レコードは複数の親レコードを持つことができます.

上の階層型のモデルをネットワーク型で表すと下図のようになります.

赤線で示したように,1つの子レコードは複数の親レコードを持つことができます.

f:id:chankilu23:20201205203214j:plain

関係型データモデル

属性名とそれぞれの属性の値の組であるタプルの組み合わせとして表形式で関係を表したのが関係型データモデルで,最も広く利用されています.

下図のように表されます.

f:id:chankilu23:20201206112709j:plain

3層スキーマ

まずはスキーマの説明から.

データベースというからには,属性やそれらをまとめるレコードを定義する必要がありますし,データ達をどのようにディスク上に格納するかも決めなければいけません.

このようなデータベースの設計の仕方を記述したものをスキーマといいます.

データベースの規模が大きくなるにつれスキーマも複雑になるので,一部に変更があったときに他にも影響がどんどん出て修正する作業がとても大変になってしまいます.

そこでスキーマを独立性の高い3種類に分割することで,データベースを変更しても他への影響が最小限になるように工夫をしました.

これをデータ独立性などどいい,スキーマに上のようなデータ独立性を持たせたものが3層スキーマです.

3層スキーマでは,データベースを扱う立場によってスキーマを分割しています.

その立場とは,データ管理者,データベース管理者,利用者,の3種類です.

それぞれの立場におけるスキーマを,概念スキーマ,内部スキーマ,外部スキーマといいます.

順に説明していきます.

概念スキーマ

データ管理者(DA:Data Administrator)によって管理されます.

エンティティやリレーションなどの情報を持ち,データベースの全体像を定義するスキーマです.

内部スキーマ

データベース管理者(DBA: DataBase Administrator)によって管理されます.

効率よくデータを検索するためにデータベース中のデータをどのように格納するかなどを定義しています.

内部スキーマでのデータの独立性を物理的データ独立性といいます.

外部スキーマ

データベースにおいて,プログラムが必要とする情報のみを定義したものです.

例えば,元のデータベースに属性などの追加があった場合でも,その外部スキーマに影響がなければ外部スキーマは影響されません.

それぞれのユーザはデータベース自体から独立しており,これを論理的データ独立性といいます.


データモデルのまとめはこんなかんじです.

思ったよりボリュームが大きくなってしまった...

3層スキーマはわりと理解が浅いので日を改めて記事を更新するかもしれません.

次はデータベースの正規化の話です.

参考:アイテックIT人材教育研究部(2020)「2021応用情報・高度共通 午前試験対策書」

システム構成<後編>

前回に引き続き,システム設計のお話です.

今回も文字ばかりになりますが...

3.信頼性設計

信頼性のあるシステムを設計するための考え方で,以下のようなものがあります.

(a)フェールセーフ (fail safe)

システムの一部に故障が生じたときには,できるだけ安全な状態を確保してシステムを停止させることです.

(b)フェールソフト (fail soft)

システムの一部に障害が生じたとき,その問題のあるシステムを切り離すなどして,全体の稼働は止めることなく残りの部分的なシステムで運転を続けることです.

なので故障が起きることを前提にシステムを組む必要があって,ある部分システムが故障したらそれを停止させたり切り離すことができるように,他の箇所に被害が及ばないような設計をする必要があります.

(c)フォールトトレラント (fault tolerant)

fault tolerantとは「障害に耐性」があるという意味で,信頼性設計に用いられる手法全般のことを言いますが,一般的にはもう少し狭い意味をさすようです.

システムの一部が故障しても,予備系のシステムに切り替えるなどして運転を引き続き行うことをフォールトトレラントということが多いらしい.

(d)フォールトアボイダンス (fault avoidance)

avoidance:回避

できるだけ故障が起きにくいようにシステムを設計します.

信頼性の高い部品を使ったり,構成をシンプルにしたり,十分にテストを通したりするなどの実現方法があります.

(e)フールプルーフ (fool proof)

システムの利用に関して不慣れなユーザに配慮したシステム設計のことです.

具体的には誤った使い方をしたときに,周囲に危険が及ばない設計,機器が破損しない設計,取り返しのつかない故障に繋がらない設計などのように組むことがあります.

もっというと,そもそも誤った使い方ができなかったり誤った使い方をしようとするとシステムが停止するような設計もあるみたいです.

4.マルチプロセッサ

一つのコンピュータに複数のプロセッサを搭載させることです.

命令などを複数のプロセッサで並列して処理できるのでシステム全体の処理能力が上がります.

マルチプロセッサではプロセッサ間で処理結果などを共有する必要がありますが,その共有の仕方の違いで密結合疎結合の二種類に分類されます.

(a)密結合プロセッサ

1つのOSが複数のプロセッサを制御し,プロセッサ間で主記憶を共有します.

主記憶を共有するので,排他制御(長くなるので別記事で)と呼ばれる技術を実装する必要があります.

排他制御ではプロセッサを増やしすぎると逆に性能が落ちるという性質があるので,とりあえず増やしとけばええやろというわけにもいかないです.

(b)疎結合プロセッサ

各プロセッサはそれぞれ主記憶とOSを持ちます.

プロセッサ間を通信インタフェースなどで繋ぎ,全体を一つのシステムとして動かすことを疎結合といいます.

以前紹介したクラスタリングはこの疎結合マルチプロセッサに分類されます.


システム構成は終わりです.

次からはデータベース!

参考:アイテックIT人材教育研究部(2020)「2021応用情報・高度共通 午前試験対策書」

システム構成<前編>

1.クライアントサーバシステム

クライアントサーバシステムとは,システムをクライアントとサーバに役割を分割することです.

飲食店でいうとホールとキッチンみたいなかんじです.

ユーザに操作されるクライアントは色々な要求をサーバに投げます.クライアントの代わりに処理をしたり情報を渡したりするのがサーバの役目です.

ホールが注文を取ってきて,キッチンが料理を作ってホールに渡すという飲食店のシステムと同じです.

(a)2層クライアントサーバシステム

上で説明したように,クライアント(プレゼンテーション層)とサーバ(データ層)に分けるシステム形態のこと.

(b)3層クライアントサーバシステム

2層よりももう1層細かく分割します.

サーバ側にファンクション層という,データ加工などの処理をする層を追加します.

イメージでは,クライアントとサーバ \times 2の3つにシステムを分割するかんじです.

2層では1つのサーバがデータの受け渡しとデータ処理の両方を行っていたのに対して,3層ではその2つの仕事を2つのサーバで役割分担するんです.

2.システムの構成方式

機器やシステムに冗長性を持たせることで,システム全体の信頼性を向上させる手法をここでは4つ紹介します.

(a)デュアルシステム

dual:二つの,二重の

全く同じ2系統のシステムをどちらも稼働させ,同じデータを処理して結果を互いに照合させます.

片方がトラブルとかで停止したら,もう片方のみで稼働させ,復帰したらもう一度両システムを稼働させます.

(b)デュプレックスシステム

duplex:二重の

同じ系統のシステムを2台用意し,普段は片方を稼働させ,もう片方は待機させておく方式.

本番系のコンピュータに障害が発生したら,予備系にディスクやネットワークを切り替えて運転を継続します.

デュプレックスシステムの中にもホットスタンバイウォームスタンバイコールドスタンバイがあります.

簡単にいうと,予備系システムが待機しているときにどれぐらい準備ができているかです.

ホットスタンバイ

予備系にはいつでも切り替えられます.

本番系のOSやアプリケーションなどをあらかじめ起動させておきます.

本番系に障害が起きたときに予備系に切り替えることをフェールオーバ,本番系が障害から復帰し元の運用形態に戻すことをフェールバックといいます.

障害時の切り替えは最速であるという反面,常に予備系を稼働させているのでコストが高いです.

ウォームスタンバイ

予備系を「ある程度」起動させておき,本番系の障害発生時に予備系に切り替えます.

(ある程度ってなに...)

と初めは思いましたが,どうやらソフトウェアなどによって予備系の起動の仕方は異なるらしい.

コールドスタンバイ

予備系は普段は停止しています.

もっというと,予備系は全く稼働していなかったり,稼働はしているが本番系とは関係ない処理をしている,などの状況があります.

本番系とは完全に独立しているので設計や運用などはシンプルですが,本番系の障害時には切り替えに時間がかかったり,本番系の処理を引き継げないことも多いというデメリットがあります.

(c)ロードシェアシステム

複数の系で一連の処理を行い,負荷を分散させる手法.

一連の処理が停止する可能性は低いですが,障害時には一部の系に負荷が偏るという特徴があります.

(d)クラスタリング

cluster:(ぶどうとかの)ふさ,群れ

クラスタ構成とは,複数のコンピュータがネットワークで接続されており,全体で一つのコンピュータのように振る舞うことです.

クラスタ構成を実現することを クラスタリングといいます.

クラスタ構成にはHAクラスタHPCクラスタがあります.

HAクラスタ(High Availability クラスタ)

可用性向上を目的としたクラスタ構成.

ホットスタンバイによる構成と,複数台のコンピュータにより並列処理を行う負荷分散クラスタがあります.

負荷分散クラスタでは,障害が起きたコンピュータは見捨てて他のコンピュータで処理を続けます.

HPCクラスタ(High Performance Computing クラスタ)

性能向上を目的としたクラスタ構成.

数千ものコンピュータに複雑な計算などを分散させて,スーパーコンピュータのような能力を実現させることが可能です.

まだ続きはあるのですが,長くなりそうなので次の記事に続きます....

参考:アイテックIT人材教育研究部(2020)「2021応用情報・高度共通 午前試験対策書」

性能評価

MIPS(Million Instructions Per Second)

単位時間あたりの処理可能な命令の数(単位は 100万であることに注意)

定義より,MIPS値の逆数(正確にはMIPS \times 100万の逆数)をとると 1命令あたりの実行にかかる時間を算出できます.

例えば 2.5MIPSであるCPUを持つ計算機は,

 2.5 \times 100万 = 250万

なので, 1秒間に 250万命令を実行可能.

そして逆数をとることにより

 \dfrac{1}{2.5 \times 10⁶} = 4 \times 10^{-7}

なので, 1命令あたり 4 \times 10^{-7}秒かかります.

ベンチマークテスト

 \large ベンチマークテスト

性能評価用の特別なプログラムを実行させることで,システムのハードウェアやソフトウェアの性能を評価すること.

代表的なものを紹介します.

1. \large ギブソンミックス

科学技術計算用のベンチマークで,不動小数点演算をさせるらしい.

今はほとんど使われていないとかなんとか.

2. \large コマーシャルミックス

商業分野の事務処理用で使われるベンチマーク

3. \large SPECベンチマーク

SPEC(The Standard Performance Evaluation Corporation)が提供しているベンチマーク

整数演算の性能評価をするSPECintと,不動小数点演算の性能評価をするSPECfpとがあります.

4. \large TPCベンチマーク

TPC(Transaction processing Performance Council:トランザクション処理性能評議会)が開発したベンチマーク

トランザクション処理システムに求められるような性能も評価可能.

保守

 \large キャパシティプランニング

新規システムの開発や,既存システムの改良などの際に行われる作業.

システムに対するユーザの要求を把握し,将来的にシステムに求められるであろうリソースを推定した後,経済性や拡張性を考慮したシステム構成を計画,構築,保守をすること.

システムの構成要素であるリソースの測定を行うことを \large モニタリングともいう.

最後に

この分野の問題は,問題をよく読んで計算をすれば難しくはない印象があります.

ただし,ぱっと見ではかなり複雑で初見だと解けなさそうな気しかしません.

大事なのは \large 問題を熟読すること

計算問題は別の記事で書きます.

参考:アイテックIT人材教育研究部(2020) 「応用情報・高度共通 午前試験対策書」

MTBFとMTTR

MTBFMTTR

MTBF(Mean Time Between Failure):平均故障間隔

システムが故障から復旧してから,次に故障するまでにかかる平均の時間

MTTR(Mean Time Between Repair):平均修理時間

システムが故障したとき,復旧にかかる時間


例えば,MTBF 6MTTR 2の時は下図のようになります.

ここで,青色はシステムが正常に稼働した時間,赤色はシステムが正常に稼働していない時間(以下,異常時間)を表します.

f:id:chankilu23:20201121235501p:plain

図からは明らかですが,

 \rm{MTBF}=\dfrac{\mathbf{正常稼働時間}}{\mathbf{故障回数}} \rm{MTTR} = \dfrac{\mathbf{異常時間}}{\mathbf{故障回数}}

が成り立ちます.

簡単な変形により,正常稼働時間や異常時間をMTBFMTTRから算出も可能.

英語表記はまぎらわしいため,何の略なのか覚える方がよさげ.


稼働率(アベイラビリティ)

全運転時間に対する,正常稼働時間の割合のこと.

平均を考える時には,上図のようにMTBFMTTRが周期的に繰り返されるので, 1周期分のみを考えればよいです.

 1周期分の全運転時間:MTBF+MTTR

 1周期分の正常稼働時間:MTBF

なので,稼働率

 \mathbf{稼働率} = \dfrac{\rm{MTBF}}{\rm{MTBF+MTTR} }

で求まります.


直列系,並列系

次に,稼働率が求まったとして,稼働率 AのシステムXとYを組み合わせたときの全体のシステムの稼働率を計算していきます.

まずは直列系システム.

f:id:chankilu23:20201121200434j:plain

これはとても簡単で,システムXもYも稼働すると考えて,確率をかけ算すればOK!

(稼働率)  = (Xが正常かつYが正常)

 = A²


次に並列システム.

f:id:chankilu23:20201121200513j:plain

こっちはちょいとややこしい.

私は2通りの求め方を知っているので今回はその2つを紹介します.

前提で知っていなければいけないのは,Xが正常か異常か,そしてYが正常か異常かで合計 4パターンの状態があるということです.

(i) 気合で計算する

システムX,Yのいずれかが稼働していれば全体も稼働するので,片っ端から足します.

(稼働率)  = (Xは正常かつYは正常) + (Xは正常かつYは異常) + (Xは異常かつYは正常)

 = A² + A(1-A) + (1-A)A

 = 2A - A²

計算が多いと嫌ですね()


(ii) 余事象の考え

システムX,Yの両方が異常である時以外は稼働する,と考えます.

つまり,全体の確率 1からシステムX,Yが両方異常である確率を引きます.

(稼働率)  = 1 - (Xが異常かつYが異常)

 = 1-(1-A)(1-A)

 = 2A-A²

実際の計算では, 1-(1-A)(1-A)の式が使い勝手が良さそう.

最後に

APでは直列系と並列系が混ざったいわゆる複合系システムというものが出題されるようですがそれは今回は触れません.

そのうち問題演習の記事を書くかも(?)

参考:アイテックIT人材教育研究部(2020)「2021応用情報・高度共通 午前試験対策書」