【第3回初心者勉強会】データベースを使おう
TRANSCRIPT
データベースを使おう飯塚修平
1
データベースって?データを貯めておくところ
ユーザ プログラム データベース
ex. ユーザ情報、マスター情報、ログ etc.
2
RDB (リレーショナルDB)
- SQL という言語を使ってやりとりする- テーブル型のデータ構造
id handle name
1 tushuhei Shuhei Iitsuka
2 amachang Hitoshi Amano
3 masall2 Masahiro Saito
NoSQL (Not Only SQL)
- RDB 以外の DB の総称- データ構造はそれぞれ異なる。
[{handle: “tushuhei”, name: “Shuhei Iitsuka”,friends: [“amachang”,
“masall2”,“naofumiwa”,“phatsu”]}]
3
ファイルじゃダメなの?
これとか こんなかんじ
もちろんファイルでもOKです。ただ・・・
4
1.かんたん(統一性)
アプリケーションごとにファイル入出力の機能をつくるのは面倒臭い。
DBならSQLで統一できる!
SELECT, INSERT, DELETE
5
2.はやい(インデックス)たとえば id が 1 ~ 31 のデータがあったとき、ある id のデータを探すには?
1
2
3
...
30
31
min: 1max: 31
インデックスなし インデックスあり
16
8 24
4 12 20 282 6 10 14 18 22 26 30
1 3 5 7 9 11 1315 171921 2325272931
min: 1max: 5
<2分木探索>
6
3.あんしん(アトミック性)たとえば INSERT 処理中にエラーが発生したら
for i = 0 to 100:hoge()INSERT DATApiyo()
endfor
i=37のときにhoge()でエラー発生、終了!!
1 aaa xxx2 bbb yyy... ... ...... ... ...37 LLL ZZZ
会員情報
中途半端な状態のデータができてしまう。
7
sqlite3 test.db #test.db を作成
CREATE TABLE users (id INTEGER, name TEXT);
INSERT INTO users VALUES (1, “tushuhei”);
INSERT INTO users VALUES (2, “amachang”);
SELECT * FROM users;
DELETE FROM users WHERE id = 1;
SELECT COUNT(*) FROM users;
INSERT INTO users VALUES (3, “masall2”);
SELECT AVG(id) FROM users;
.q #終了8
データベース設計
{id: 1,name: “tushuhei”,items: [“もろはのつるぎ”, “やくそう”, “まじっくすてっき”]}
ユーザマスタテーブルをつくろう!
9
例1id name items
1 “tushuhei”“もろはのやいば”,
“やくそう”, “まじっくすてっき”
2 “amachang”“まじっくすてっき”,
“ぽーしょん”
... ... ...
10
こんなときどうする?
「アイテムの名前が変更になった!」
「やくそう」->「べほまぐさ」
ユーザのデータすべてに適用するの・・・?
11
例2id name items
1 “tushuhei” 1, 2, 3
2 “amachang” 3, 4
users
id name
1 “もろはのやいば”
2 “やくそう”
3 “まじっくすてっき”
4 “ぽーしょん”
items
ここを変更すればOK
12
こんなときどうする?
アイテム “もろはのやいば” を持っている人の一覧を出したい!
このままだと、ユーザがアイテム追加時に面倒
SELECT item FROM users WHERE id = xxx;
$items = $items . “, yyy”;
UPDATE users SET item = $items WHERE id = xxx;
13
例3id name
1 “tushuhei”
2 “amachang”
user item
1 1
1 2
1 3
2 3
2 4
id name
1 “もろはのやいば”
2 “やくそう”
3 “まじっくすてっき”
4 “ぽーしょん”
users user_item item
14
正規化
正規化とは,データの冗長性を少なくして,関連性の強いデータ項目(属性)郡をまとめて,一事実一箇所(1 fact in 1 place)になるようにすることです。
斎藤末広のページ http://www.mirai.ne.jp/~suehiro/am/kihonyougo/normal.htm
15
sqlite3 test.db #test.db を作成
CREATE TABLE items (id INTEGER, name TEXT);
INSERT INTO items VALUES ( ...
CREATE TABLE user_item (user INTEGER, item INTEGER);
INSERT INTO user_item VALUES ( ...
SELECT * FROM users LEFT JOIN user_item ON users.id = user_item.user;# LEFT JOIN: テーブルをくっつけるのに使う。ONは結合条件。
SELECT * FROM users LEFT JOIN user_item ON users.id = user_item.user LEFT JOIN items ON user_item.item = items.id;
16
1.@oshiba_bot
CREATE TABLE tweets (
id INTEGER PRIMARY KEY,
tweet_id INTEGER,
);
同じつぶやきを変換しないようにする。
17
2.お花サプライズ!
18
3.ウェルカムページメーカー
no database.
19
今後の予定2/18(Sat) 11:00-14:00 Amazon EC2勉強会
2/18(Sat) 18:00-「ゲームのちからで世界を変えよう会議」参加のためお休み
2/25(Sat) 18:00- 飯塚が用事あり(要相談)
2/26(Sun) か 3/3(Sat) プロジェクト割振り会
3月中旬 開発合宿@東京大学検見川運動場
5月 リリース会20
参考: お花サプライズ!
解決する問題・痛み
解決法アイデア
ビジネスプラン
プロダクトデザイン
プロトタイプ v0
生花店との提携 決済代行会社との提携
プロトタイプ v1 プロトタイプ v2 リリースプロダクト設計/開発
ビジネス設計/開発
8月 9月 10 月 11 月
合宿
21
参考: 国会.in
7/1 アイデア出し
7月下旬 プロトタイプ完成
8月 開発合宿 -> 基本的な機能が揃う
9月半ば リリース
22
東京大学検見川運動場
23
東京大学検見川運動場
24
開発合宿
3月頃の学生が春休みときに。
3泊4日
各プロジェクトに必ず学生が一人はいる。
途中参加・途中退出あり
準備が命「現地では絶対に勉強しない!」
25