初めてのシステムと日記

システムも日記も初めてです。

研修(テーブル設計)

今まで作成してきた入力フォーム用のデータベースを作ってみる。


入力項目

姓(*):名(*):フリガナ(姓)(*):フリガナ(名)(*):性別(*):
郵便番号(*):都道府県(*):市町村区(*):番地(*):
メールアドレス(*)趣味(*):ご意見:


条件
 ・useridにINDEX,AUTO_INCREMENTの設定
 ・登録日時と更新日時を登録
 ・都道府県データをデータベースから取得できるよう、都道府県ID 都道府県名 というテーブルを作成
 ・user_infoのカラムで正規化できる箇所を正規化する。


INDEX
テーブルの格納されているデータを高速に取り出すための仕組み。
1つのクエリで1つのテーブルに対し1つのインデックスしか機能しない。
これを回避する方法もある。(複合インデックス)


AUTO_INCREMENT
数字型のフィールドに自動的に増加する数字を挿入する属性。
レコードを挿入するたびに1ずつ増えていく。ID用によく使われる。


正規化
調査中。たぶん別の日記に書くでしょう。


データベース作成、テーブル作成は前回とほぼ同じなので省略。


■useridにindex、auto_increment設定

カラムに対してindex、もしくはprimary_keyが設定されないと、

auto_incrementは設定できない。なので最初にindexを設定する。

mysql> alter table user_info add index(userid);
mysql> show fields from user_info;
+-------------+-----------+------+-----+-------------------+----------------+
| Field       | Type      | Null | Key | Default           | Extra          |
+-------------+-----------+------+-----+-------------------+----------------+
| userid      | int(11)   | NO   | MUL | NULL              |                |
| lastname    | text      | YES  |     | NULL              |                |
| firstname   | text      | YES  |     | NULL              |                |
| lastkana    | text      | YES  |     | NULL              |                |
| firstkana   | text      | YES  |     | NULL              |                |
| sex         | text      | YES  |     | NULL              |                |
| zipcode     | int(11)   | YES  |     | NULL              |                |
| pref        | text      | YES  |     | NULL              |                |
| address     | text      | YES  |     | NULL              |                |
| housenumber | text      | YES  |     | NULL              |                |
| email       | text      | YES  |     | NULL              |                |
| hobby       | text      | YES  |     | NULL              |                |
| opinion     | text      | YES  |     | NULL              |                |
| createtime  | datetime  | YES  |     | NULL              |                |
| updatetime  | timestamp | NO   |     | CURRENT_TIMESTAMP |                |
+-------------+-----------+------+-----+-------------------+----------------+

Key:MUL 重複可能なindex

useridに対してindex設定が出来た。


次はuseridにauto_increment設定を行う。

mysql> alter table user_info modify userid int auto_increment;
mysql> show fields from user_info;
+-------------+-----------+------+-----+-------------------+----------------+
| Field       | Type      | Null | Key | Default           | Extra          |
+-------------+-----------+------+-----+-------------------+----------------+
| userid      | int(11)   | NO   | MUL | NULL              | auto_increment |
| lastname    | text      | YES  |     | NULL              |                |
| firstname   | text      | YES  |     | NULL              |                |
| lastkana    | text      | YES  |     | NULL              |                |
| firstkana   | text      | YES  |     | NULL              |                |
| sex         | text      | YES  |     | NULL              |                |
| zipcode     | int(11)   | YES  |     | NULL              |                |
| pref        | text      | YES  |     | NULL              |                |
| address     | text      | YES  |     | NULL              |                |
| housenumber | text      | YES  |     | NULL              |                |
| email       | text      | YES  |     | NULL              |                |
| hobby       | text      | YES  |     | NULL              |                |
| opinion     | text      | YES  |     | NULL              |                |
| createtime  | datetime  | YES  |     | NULL              |                |
| updatetime  | timestamp | NO   |     | CURRENT_TIMESTAMP |                |
+-------------+-----------+------+-----+-------------------+----------------+

Extra:auto_increment

設定完了。


■都道府県データベース作成

少しクエリの書き方に注意して作成してみた。

mysql> insert into pref_data(prefid, prefname) values
    -> (1, '北海道'),
    -> (2, '青森県'),
    -> (3, '岩手県'),
    -> (4, '宮城県'),
    -> (5, '秋田県'),
    -> (6, '山形県'),
    -> (7, '福島県'),
    -> (8, '茨城県'),
    -> (9, '栃木県'),
    -> (10, '群馬県'),
    -> (11, '埼玉県'),
    -> (12, '千葉県'),
    -> (13, '東京都'),
    -> (14, '神奈川県'),
    -> (15, '新潟県'),
    -> (16, '富山県'),
    -> (17, '石川県'),
    -> (18, '福井県'),
    -> (19, '山梨県'),
    -> (20, '長野県'),
    -> (21, '岐阜県'),
    -> (22, '静岡県'),
    -> (23, '愛知県'),
    -> (24, '三重県'),
    -> (25, '滋賀県'),
    -> (26, '京都府'),
    -> (27, '大阪府'),
    -> (28, '兵庫県'),
    -> (29, '奈良県'),
    -> (30, '和歌山県'),
    -> (31, '鳥取県'),
    -> (32, '島根県'),
    -> (33, '岡山県'),
    -> (34, '広島県'),
    -> (35, '山口県'),
    -> (36, '徳島県'),
    -> (37, '香川県'),
    -> (38, '愛媛県'),
    -> (39, '高知県'),
    -> (40, '福岡県'),
    -> (41, '佐賀県'),
    -> (42, '長崎県'),
    -> (43, '熊本県'),
    -> (44, '大分県'),
    -> (45, '宮崎県'),
    -> (46, '鹿児島県'),
    -> (47, '沖縄県');

mysqlは最後の行に;が付かない限り、Enter押してもクエリが書ける。

なのでインデントではないけど、実行したクエリが見やすいように書いてみた。


大学院時代に教えてたのに、すっかり抜けてしまっている。。。


正規化に関しては後日まとめる。

3Dでベクトルやら行列の正規化はやってきたけど、

mysqlの正規化とは全く異なる。

同じ言葉でも業界によってこうも違うとは・・・面白い。