論理設計と正規化
論理設計の4ステップ
エンティティの抽出
エンティティの定義
正規化
ER図の作成
エンティティの抽出・定義
エンティティとは、日本語で「実体」という意味にあたります。
具体的には、物理的実体を伴うものだと顧客・社員・店舗といったものや、
概念としてしか存在しない注文・予約などが挙げられます。
RDBにおいては、テーブルの名前になるものにあたります。
エンティティの抽出
エンティティの抽出とは、実現したいシステムで、どんなエンティティを管理する必要があるか洗い出すプロセスのことをいいます。
(例)本の予約管理システム
→書籍・予約・予約者などのエンティティ
エンティティの定義
エンティティの定義とは、各エンティティがどのような属性(データ)を保持するかを決めるプロセスのことをいいます。
各テーブルがどんなカラムを持つのか定義します。
テーブルとは
テーブルとは、共通点を持ったレコードの集合のことをいいます。
テーブル名はすべて複数形/ 複数名詞で表します。
テーブルの構成要素
行と列
キー
制約
❏ 行と列
「行(レコード)」と「列(カラム)」と呼びます。
❏ キー
キーとは、ある特定のデータを引き出すための鍵となる列のことです。
表にはなくてもいいですが、テーブルにはなくてはならないものです。
主キーと外部キーがあります。
主キー(プライマリーキー):その値をしていすれば必ず一行のレコードを特定できるような列
外部キー:2つのテーブル間の列同士の関連性を設定するもの
❏ 制約
参照整合性制約のように、テーブルには制約をつけることが出来ます。
他の代表的な制約としてNOT NULL制約があります。
NOT NULL制約とは、
→NULLを禁止する制約のことで、
NULLとは「フィールドにデータが入っていない状態のこと」を指します。
正規化
正規化とは、システムでの利用がスムーズに行えるようにエンティティを整理するプロセスのことをいいます。
リレーショナルデータベースにおけるエンティティの整理は、正規化に整えることを指しています。
正規形とは
→データベースにおいて保持するデータの重複が排除されたデータ形式のことです。
データの重複(冗長性)があると、無駄なデータ領域と面倒な更新処理を発生させてしまいます。
正規形には第1〜第5正規形までが存在します。
業務では第3正規形まで考えることが多いです。
第一正規化
第一正規化とは、「一つのフィールドには1つの値しか含まない」という原則が守られている状態ことを指します。
Q . なぜ1つのフィールドに複数の値を入れてはダメなのか?
→複数の値を許すと、主キーが各列の値を一意に定める事ができなくなるからです。
→主キーの定義に反します。
関数従属性
xの値を一つ決めれば、yの値が1つに決まる関係性のことを関係従属性と呼びます。
「yはxに従属する」のことを指しています。
まとめると、
正規化とは、「テーブルのすべての列が関数従属性を満たすように整理していくこと」であり、{x}→{y}に当たります。
第2正規形
部分関数従属が解消されていて、完全関数従属のみのテーブルになっている形です。
部分関数従属とは
→複数列からなる主キーの一部の列に対して従属する列がある状態。
完全関数従属は
→主キーを構成するすべての列に対して従属性がある状態。
Q. なぜ部分関数従属が良くないのか
→値の更新の手間が増えてしまうからです。
第3正規形
推移的関数従属が解消されている形です。
推移的関数従属
推移的関数従属とは、2段階の関数従属がある状態のことをいいます。
まとめ
正規化とは、テーブルのすべての列が関係従属性も満たすように整理することにより、データの冗長性を排除するプロセスのこと。
第1正規形では、1つのフィールドには1つの値が、
第2正規形では、部分関係従属の解消、
第3正規形では、推移的関数従属の解消を行っている
正規化したテーブルはJOINによる結合で正規化の前の状態に戻せる。
このことを無損失分解という。
正規化の逆操作は結合という。
データベースと論理設計
データベースとは、
大量の情報を保存し、コンピュータから効率よくアクセスできるように加工したデータのあつまりのことをいいます。
データベースの由来
由来は第二次世界大戦後の米軍から来ていると言われています。
情報のアクセスを効率化するために点在していた資料をひとつの基地にすべて集め、その場所を、情報(Data)の基地(Base)と呼んだことからデータベースと名付けられたそうです。
データベース利用の流れ
キーワードとなるのは、SQL、RDBMS、RDBテーブルです。
データベースの利用は、
1. 利用者がSQLという言語を用いてRDBMSに指示を出す。
2. RDBMSはRDBテーブルにアクセスをして支持されたデータを取得や操作する
3. ビューという形になり我々利用者に届けられる
という流れで行われています。
データベース設計
データベース設計とは、
システム開発のひとつのプロセスです。
データベースに保持するデータに関する設計のことを言います。システムの拡張性やパフォーマンスに多大な影響を与えるシステム開発において極めて重要なプロセスです。
❏ システム開発のプロセス
-
要件定義
-
設計
-
開発
-
テスト
3層スキーマ
データベースは3層のスキーマ(枠組み)から成り立っています。
上に行くほどユーザーに近く、下に行くほどコンピュータに近いです。
外部スキーマはビュー
概念スキーマはテーブル
内部スキーマはデータファイルの役割を担っています。
論理設計と物理設計
論理設計(概念スキーマ:テーブルの設計)
→データを管理するためのデータモデルの設計のことをいいます
物理設計(内部スキーマの設計)
→DDLによる実装やストレージの構成などの設計のことをいいます
概念スキーマはなぜ必要か
→データ独立性を確保するのに、概念スキーマは絶対に必要になります。
データ独立性とは?
データ独立性は2種類あります。
論理的データ独立性と物理的データ独立性の2種類です。
- 論理的データ独立性
→外部スキーマを変更しても内部スキーマを変更する必要がない状態。(外部スキーマでの変更が内部スキーマに及ばない)
- 物理的データ独立性
内部スキーマ外部スキーマが独立している状態のことをデータ独立性があるといいます。
論理設計が超重要な理由
フォームを作る
フォームに必要な要素
フォームに必要な要素は、
<form>、<label>、<input>、<textarea>、<button>の5つです。
<form>要素
<form>要素は、フォーム関連の集まりを表す要素です。
すべてのフォームは<form>要素から始まります。
<form action="/my-handling-form-page" method="post"> </form>
action
属性は、フォームで収集したデータを送信すべき場所 (URL) を定義し、method
属性は、データを送信するために使用する HTTP メソッド (get
またはpost
) を定義します。
<label>、<input>および<textarea>要素でウェジェットを追加する
連絡フォームはシンプルで 3 つのテキストフィールドを持っており、それぞれに対応した <label> がついています。
label要素で関連付けを行うと、ラベル部分のクリックでその部分を選択できるようになります。ラジオボタンやチェックボックス選択のときに役立ちます。
<form action="/my-handling-form-page" method="post">
<ul>
<li>
<label for="name">Name:</label>
<input type="text" id="name" name="user_name">
</li>
<li>
<label for="mail">E-mail:</label>
<input type="email" id="mail" name="user_email">
</li>
<li>
<label for="msg">Message:</label>
<textarea id="msg" name="user_message"></textarea>
</li>
</ul>
<li>
要素はコードを扱いやすく構造化するとともに、スタイル設定を容易にするために用いられます。
<input>
要素でもっとも重要な属性は、type
属性です。この属性は <input> 要素の見た目や動作を定義するため、とても重要になっていきます。
<button>を追加する
<li class="button"> <button type="submit">メッセージを送信</button> </li>
<button> 要素は type 属性を受け付けます。
submit、reset、buttonの3 種類の値を受け付けます。
submit
ボタンをクリックするとフォームのデータを<form>要素の action 属性で定義した ウェブページへ送信します。reset
ボタンをクリックすると、直ちにすべてのフォームウィジェットを既定値にリセットされます。UX の観点ではこのボタンはバッドプラクティスであると考えられており、どうしても必要な理由がない限りこのボタンの使用は避けるようにしなければならないといわれています。button
ボタンをクリックすると...何も起きません。おかしなことのように見えますが、JavaScript を使用してカスタムボタンを作成するために驚くほど役立ちます。
見栄えを良くする
<style>要素は、文書内にスタイルシートを記述するための要素です。
<style>要素を追加することで見栄えがよくなります。
<style> </style>
# <style>タグの中に、以下を入れると見栄えがよくなる
form {
/* フォームをページの中央に置く */
margin: 0 auto;
width: 500px;
/* フォームの範囲がわかるようにする */
padding: 1em;
border: 1px solid #CCC;
border-radius: 1em;
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
form li + li {
margin-top: 1em;
}
label {
/* すべてのラベルを同じサイズにして、きちんと揃える */
display: inline-block;
width: 90px;
text-align: right;
}
input, textarea {
/* すべてのテキストフィールドのフォント設定を一致させる
デフォルトで、textarea は等幅フォントが設定されている */
font: 1em sans-serif;
/* すべてのテキストフィールドを同じサイズにする */
width: 300px;
box-sizing: border-box;
/* テキストフィールドのボーダーの外見を同一にする */
border: 1px solid #999;
}
input:focus,
textarea:focus {
/* アクティブな要素を少し強調する */
border-color: #000;
}
textarea {
/* 複数行のテキストフィールドをラベルにきちんと揃える */
vertical-align: top;
/* テキスト入力に十分な領域を与える */
height: 5em;
}
.button {
/* ボタンを他のテキストフィールドと同じ場所に置く */
padding-left: 90px; /* label 要素と同じサイズ */
}
button {
/* このマージンは、ラベルとテキストフィールドの間のスペースと
おおよそ同じスペースを表す */
margin-left: .5em;
}
保存して再読み込みすればOKです。
データをウェブサーバーに送信する
<form>
要素はaction
属性とmethod
属性により、どこへどのようにデータを送信するかを定義します。
フォームコントロールにnameをつけます。
これらの名前はクライアント側とサーバー側の両側で重要になります。ブラウザー側ではそれぞれのデータにどのような名前をつけるかを示すものであり、サーバー側では名前によってそれぞれのデータを扱うことができます。フォームデータは名前/値のペアとしてサーバーに送信されます。
データに名前をつけるために、各々のデータを集めるフォームウィジェットの name 属性を使用しなければなりません。
<form action="/my-handling-form-page" method="post">
<ul>
<li>
<label for="name">Name:</label>
<input type="text" id="name" name="user_name" />
</li>
<li>
<label for="mail">E-mail:</label>
<input type="email" id="mail" name="user_email" />
</li>
<li>
<label for="msg">Message:</label>
<textarea id="msg" name="user_message"></textarea>
</li>
...
この例では、フォームはそれぞれれ"user_name
"、"user_email
"、"user_message
" と名付けられた 3 つのデータを送信します。これらのデータは URL "/my-handling-form-page" へ、HTTP POST メソッド
で送信します。
サーバー側では URL "/my-handling-form-page
" のスクリプトが、HTTP リクエストに埋め込まれた 3 つのキーおよび値のアイテムリストとしてデータを受け取ります。
参考
HTML5/フォーム/label要素 フォーム部品とラベルを関連付ける - TAG index
HTML5/フォーム/button要素 内容を持つボタンを作る - TAG index
フォームデータの送信
Webは基本的なクライアント・サーバー構成に基づいています。
クライアント(Webブラウザ)はHTTPプロトコルを使用してサーバーにリクエストを送ります。サーバーは同じプロトコルを使用してリクエストに答えます。
クライアント側において、HTMLフォームはサーバーへデータを送信するHTTPリクエストを組み立てるための、便利でユーザーに使いやすい手段でしかありません。
フォームによって、ユーザーがHTTPリクエストで渡す情報を提供することができます。
クライアント側:データ送信方法の定義
<form>要素で、データを送信する方法を定義します。
重要な属性はactionとmethodの2つです。
❏ action属性
action属性はどこにデータを送信するかを定義します。
値は妥当な相対 / 絶対URLでなければいけません。
絶対URL
<form action="http://example.com>"
相対URL
<form action="/somewhere_else">
属性を指定しない場合
<form>
<form>要素はフォームが表示されているページ自身に対してデータを送信します。
❏ method属性
どのようにデータを送信するかを定義します。
HTTPプロトコルはリクエストを実行するための方法をいくつか提供しており、HTMLフォームのデータは複数の方法で送信することが出来ます。
もっとも一般的なものはGETメソッドとPOSTメソッドです。
❍ GETメソッド
GETメソッドは、サーバーに対して指定したリソースを返すよう求めるためにブラウザが使用するメソッドです。
まず、ブラウザは空の本文を送信します。
本文が空であるため、フォームをこのメソッドで送信する場合はデータをURLの後に付加します。
<form action="<http://foo.com>" method="get">
<div>
<label for="say">What greeting do you want to say?</label>
<input name="say" id="say" value="Hi">
</div>
<div>
<label for="to">Who do you want to say it to?</label>
<input name="to" id="to" value="Mom">
</div>
<div>
<button>Send my greetings</button>
</div>
</form>
GETメソッドが使用されているため、フォームを送信するときにブラウザのアドレスバーにwww.foo.com/?say=Hi&to=MomというURLが表示されます。
URLに追加されたデータは名前と組の連続になっています。
URLのWebアドレスが終了した後、疑問符(?)に続いて名前/値の組がそれぞれアンパサンド(&)で区切られて入ります。
-
say の値は Hi
-
to の値は Mom
HTTPリクエストは以下のようになります
GET /?say=Hi&to=Mom HTTP/1.1 Host: foo.com
❍ POSTメソッド
このメソッドはHTTPリクエストの本文で提供したデータを考慮したレスポンスの要求を、ブラウザがサーバーへ送信するためのメソッドです。
このメソッドを使用してフォームを送信する場合は、データがHTTPリクエストの本文の後に追加されます。
<form action="<http://foo.com>" method="post">
<div>
<label for="say">What greeting do you want to say?</label>
<input name="say" id="say" value="Hi">
</div>
<div>
<label for="to">Who do you want to say it to?</label>
<input name="to" id="to" value="Mom">
</div>
<div>
<button>Send my greetings</button>
</div>
</form>
データがPOSTメソッドで送信されると、URLにはデータが追加されません。
HTTPリクエストは以下の通りです。
POST / HTTP/1.1 Host: foo.com Content-Type: application/x-www-form-urlencoded Content-Length: 13 say=Hi&to=Mom
プログラミング言語について調べてみた。
プログラミングの言語は、
ある程度のユーザーがいる言語に限っても250以上の種類のプログラミング言語が存在していると言われています。
しかし全ての言語が今も使われているわけではなく実際に使用されているのは全体の10%程度です。
今日はプログラミング言語で使われている代表的なものを
いくつか取り上げ徹底的に調べていこうと思います。
目的別プログラミング言語
プログラミング言語は、言語によって得意とする分野は異なります。
今回はWeb開発のプログラミング言語を5種類説明していきます。
Web開発
サーバーサイド開発
AI / 機械学習
Web開発
Web開発では、WebアプリケーションのプログラミングやWebシステム、Webソフトウェアの開発を行う仕事です。
Webサイト上で使用されるアプリケーションを設計、構築、開発する職種を、
Webエンジニアと呼んでいます。
要件定義に従って作成された仕様書などからプログラミングをしていく職種をプログラマーと呼ばれています。
❏ 使う言語一例
などを用いて開発が行われています。
📍Java
Javaは、GitHubでも最も人気の高い言語で、静的型付けコンパイル言語として使われています。
Webシステムから基幹システム、ゲーム、スマホアプリまで様々な分野で使われており、大規模開発では定番の言語です。
銀行系やeコマースなどの大手企業の開発案件ではJavaが圧倒的なシェアを持っています。
学習難易度は高めです。
フレームワークもありますが、それ以外にサーブレットやJSPも含めて習得すべき事が多いので、初心者にはハードルが高いといえます。
📍PHP
PHPは、1996年度に誕生した言語で、
Webのサーバーサイドで用いられている動的型付け言語です。
データベースとの連携に強く、HTMLに埋め込む形でコードを実行することもできるため、WEB開発において非常によく使用されている言語です。
また、ソースコードの可読性が高く、基本的なルーチンの作り方や処理、命令文の形式を理解できれば、すぐにアプリ開発を行う事ができます。
上記の画像の通り、世界のWEBサイトの80%近くでPHPは使われており、
絶大的な人気を保持し続けています。
とても人気がある言語なので、日本語の参考書や解説サイトが豊富に揃っており、初学者でも勉強しやすい言語であるといえます。
PHPで、ブログ&掲示板サイトやECサイト、社内管理システム、お問い合わせフォームなどを作ることが出来ます。
📍Ruby
Rubyは、1995年に一般公開された言語で、動的型付けスクリプト言語です。
日本で開発された言語であるため、日本国内でのコミュニティがとても活発です。
スクリプト言語であるため、文法が比較的簡単です。
初学者でRubyを選択する日本人も多いので、日本語の参考書や質問記事が充実しています。
2004年に誕生した「Ruby on Rails」はWebアプリケーションを作成するためのフレームワーク(枠組み)で、これを利用してさまざまなアプリケーションの開発ができます。
Ruby on Railsを用いて、
アプリケーションサイト、ショッピングサイト、SNSサイトなどを作ることができます。
Wantedly やAirbnb もRubyが使われています。
📍 Perl
Perlは1987年アメリカ人ラリウォールによって開発された言語です。
30年以上の歴史があり幅広い層に名前が知られています。
誰でも利用できる言語で、UNIXやWindowsなどの環境下でも動作します。C言語やシェルスクリプトなどの他言語の良い部分を取り入れて開発します。
現在ではPerlの他にもWeb開発に使われるメジャーな言語が増えているため、最近では使われなくなってきています。
特徴として、
・高い後方互換性がある
・テキスト処理に優れている
・可読性が高い
・コンパイルが不要
があります。
📍 Python
Pythonは1991年にオランダ人のグイド・ヴァンロッサムというプログラマーによって開発された言語です。
Pythonで、出来ることは多岐に渡っており、
組み込み開発や、Webアプリケーション、デスクトップアプリケーション、さらには人工知能開発、ビッグデータ解析などを行うことが出来ます。
主な特徴は、
少ないコードで簡潔にプログラムを書けることと、専門的なライブラリが豊富にあることです。
代表的はフレームワークとしてDjango(ジャンゴ)があります。
Youtube、Instagram、DropboxもPythonで作られています。
参考
【入門編ソースコード有】PHPとは?初心者向けプログラミング言語のPHPでできることも徹底解説 | パソナテック
【難易度順】プログラミング言語を一覧で一挙紹介! | パソナテック
開発言語7選! Web開発の人気プログラミング言語を比較 | テックキャンプ ブログ
プログラミング言語のRubyとは?特徴やできることを解説|発注成功のための知識が身に付く【発注ラウンジ】
Perlってどんな言語?できることやPython、Rubyとの違いを解説! | Geekly Media
Pythonとは?大人気プログラミング言語のメリットや活用事例をご紹介
一旦ここで切り上げて
【ネットワーク】情報セキュリティ
コンピュータ技術を使用して、
さまざまな悪意をもったプログラムが仕掛けられることがあります。
これらを総称してマルウェアと呼びます。
今日はマルウェアをいくつか紹介していきます。
コンピュータウイルス
他のパソコンを攻撃したり、情報を盗む目的で悪意をもった人間によって意図的に作られた不正なプログラムのことです。
ボット
処理を自動化するソフトウェアです。
ウイルス感染により、ボット化したPCは外部から遠隔操作が可能になり、一斉攻撃などの手法によって悪用されます。
ボットに感染したパソコンを「ゾンビパソコン」と呼ばれています。
ゾンビパソコンがたくさん集まったネットワークは「ゾンビネット」と呼ばれています。
スパイウェア
スパイウェアとはユーザーに気づかれずに、無断でコンピュータに不正侵入して、ユーザーの行動や個人情報を収集して送信するソフトウェアです。
ランサムウェア
コンピュータに保存していたデータを暗号化するなどして、使えない状態にし、元に戻す代わりに金銭を要求します。
ランサムウェアの感染経路としては、主に犯罪者が送付したメールの添付ファイルを開いたりしたことをきっかけにウイルスに感染します。
第三者のウェブサイトを改ざんしてウェブサイトにアクセスしただけでウイルスに感染することもあるのでとても怖いウイルスです。
ワーム
ワーム(worm)とは英語で(細長く足のない)虫のことを意味します。
ワームの特徴として「自身で複製できる」「単独で活動できる」という特徴があります。
ワームの感染経路として、
メール・WEB経由・外部記録媒体経由・ネットワーク経由があります。
メール・WEB経由では、
メールに添付されるURLやWebサイトを開いたりすることによって感染することがあります。
外部記録媒体では、
USBメモリやCD、DVDから感染することがあります。
ネットワーク経由では、
インターネットからパケットとして飛んでくるものと、ファイル共有などで専用のプロトコルを利用するものがあります。
トロイの木馬
害のないプログラムを装い、侵入したコンピュータにバックドア(裏口:不正ログインできる出入口)を設置します。このように、コンピュータを遠隔操作できるようにするツールをRAT(Remote Access Tool)と呼びます。
<被害例>
・インターネットバンキングやネットショップを利用するタイミングでIDやパスワードを盗まれる
・デバイス内の個人情報を盗み見られる
・メール機能の悪用がされる
マクロウイルス
文書作成や表計算ソフトのマクロ機能を悪用したコンピュータウイルスです。
参考
【Rails】モジュール
Rubyには、まとまりをもった設計図を一箇所にまとめた存在として、
「モジュール(Module)」という概念があります。
モジュールの特徴
moduleは、
classと同じようにmodule内に関数の定義をすることが出来ますが、
moduleには
・インスタンスが生成できない
・継承出来ない
といった特徴があります。
モジュール名の制約
モジュール名は必ず大文字から始めます。
このように書くと、
#=> SyntaxError: class/module name must be CONSTANT
というエラーが発生してしまいます。
module hello→ module Hello としましょう。
モジュールを使う目的
・名前空間の提供
・インスタンスメソッドとして取り込む(Mix-in)
・モジュールをオブジェクトに取り込む(extend)
・モジュール関数
名前空間の提供
名前空間とは、クラスとモジュールに名前をつけていれるための入れ物やタグのことをいいます。この名前空間を使うことで名前のかぶりを回避することが出来ます。
呼び出しは、::演算子を使い、
「モジュール名::モジュール名」または「モジュール名::クラス名」として呼び出します。
インスタンスメソッドとして取り組む(Mix-in)
Rubyのクラスは単一継承(クラスを1つしか継承できないという設計)のみですが、
モジュールをクラスに取り組むことで多重継承を可能にしています。
Mix−inにすることで、
クラスの肥大化を防いだり、クラスをまたがった同じ処理の繰り返しを防ぐことができます。
参考
Rubyのmoduleの使い方とメリットを理解して脱初心者!|TECH PLAY Magazine [テックプレイマガジン]