fc2ブログ

DBの正規化について

DBのテーブルでの構造について
すべてのデータを1つのテーブルにまとめようとして
各カラムには値を1つだけというようにした場合

あるカラムで
同じデータが複数回
繰り返して格納されるというような必要性がでるときもある

このようなデータが何度も繰り返し入力されるのを解決するのが
正規化

これは同じデータを複数回繰り返すという状態を解決するために

テーブルを増やす操作のこと

正規化は
第1~5正規化
とか
ボイス・コッド正規化がある

一般的には第3正規化までが多いらしい
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

MyISAMとInnoDB

10日でおぼえるFacebookアプリ開発入門教室 (10日でおぼえるシリーズ)
を参考に、
phpMyAdmin にログインし
SQL を実行したところ、

書籍では 種別のところが
InnoDB
となっていたのに、

実際に実行したら
MyISAM

となっていたので、これを調べてみました

参考サイトは
MyISAMとInnoDB

どうやら
MyISAMはMySQLのデフォルトストレージエンジンで、
ストレージエンジンを指定せずにテーブルを作成すると
MyISAMが選択されるようです


テーマ : プログラミング
ジャンル : コンピュータ

INSERT 文

DBに記録するには INSERT文を使います

構文は
INSERT INTO テーブル名 VALUES(データ);
これは
データを単純に追加する

データのところには
テーブルを定義した際に
指定したカラムの順番で
データを , で区切って記述します

次に

INSERT INTO テーブル名 VALUES(データ) ON
DUPLICATE KEY UPDATE カラム名 = データ

これだと
データを追加する際に重複値の生成を避ける

こちらの場合
primary key のカラムにすでに同じ値の
データがあった場合、特定のカラムデータを書き換えるように支持する
ようにします

テーマ : プログラミング
ジャンル : コンピュータ

select 文

構文は
SELECT カラム名 FROM テーブル名 WHERE 条件

ほとんどの場合、例題だと
カラム名は *

これは、全部を意味しています

ちなみに、

ではなくて、

集合関数とよばれる
SUM
MAX
MIN
AVG
COUNT
などの指定もできます

集合関数は、EXCEL などでも使うので
馴染みがあるかもしれません

テーマ : プログラミング
ジャンル : コンピュータ

フォームからの入力をDBへ保存する場合

今日はちょっと難しめですが、フォームから入力した情報をDBへ保存する場合の処理です

$sql = sprintf('INSERT INTO my_items SET maker_id=%d,
item_name="%s", price=%d, keyword="%s"',
mysql_real_escape_string($_POST['maker_id']),
mysql_real_escape_string($_POST['item_name']).
mysql_real_escape_string($_POST['price']),
mysql_real_escape_string($_POST['keyword'])
);

mysql_query($sql) or die(mysql_error());

このように
%d や %s というようにすれば、入力した数値や文字などを
DBへ POST 送信できるようになります

ちなみに、%s が "" で囲ってあるのは、文字列だからです

%d は数値
%s は文字列の入力に使います

C 言語とかでも使いますので覚えておくと便利です

$_POST は POST 送信するという定数です
GET と POST がありますが
GET だと
GETでは日本語などの全角文字を送信できない
とか
GETには送信できる情報量に制限がある

そして
GETの場合は送信内容がURLとして渡される
つまり内容丸見えです
これは非常にセキュリティを考えるとまずいので
極力POSTを使いましょう

もっと詳しい解説として
GETとPOSTの違い
に解説が載っています

また、重要なことですが
mysql_real_escape_string() は
SQLインジェクション対策です

これは
フォームからの情報で
' OR ''='
つまり
SELECT * FROM testtable WHERE password='' OR ''='';
という実行と同じで
意味は
password フィールドが空 または空が空の場合という条件となっています

これが実行されると、すべてのレコードに条件があてはまり
パスワードによる認証が無効化され、データが盗み出されます

このため、対策として
mysql_real_escape_string()
を使うことで、入力される文字列でSQLにとって危険とされる文字を無効化しておきます


そして、今回は sprintf() を使って書き込みしていますが
$sql = sprintf('INSERT INTO my_items SET maker_id=%d,
item_name="%s", price=%d, keyword="%s"',
mysql_real_escape_string($_POST['maker_id']),
mysql_real_escape_string($_POST['item_name']).
mysql_real_escape_string($_POST['price']),
mysql_real_escape_string($_POST['keyword'])
);


$sql = 'INSERT INTO my_items SET maker_id='
.mysql_real_escape_string($_POST['id']) .' ,
'.item_name="' .mysql_real_escape_string['item_name']) .'",
.price=' .mysql_real_escape_string($_POST['price']) . ',
keyword="' .mysql_real_escape_string($_POST['keyword']). '"';
としても
同じ意味になります

テーマ : プログラミング
ジャンル : コンピュータ

最新記事
検索フォーム
GREEハコニワ攻略サイト
リンク
カテゴリ
月別アーカイブ
フリーエリア
最新記事
FXプライムレート
最新コメント
最新トラックバック