データベースを使おう
   飯塚修平




             1
データベースって?
 データを貯めておくところ




ユーザ       プログラム    データベース


ex. ユーザ情報、マスター情報、ログ etc.

                            2
RDB (リレーショナルDB)                   NoSQL (Not Only SQL)




- SQL という言語を使って                  - RDB 以外の DB の総称
やりとりする                           - データ構造はそれぞれ異
- テーブル型のデータ構造                    なる。
                                 [{handle: “tushuhei”,
id    handle        name
                                 name: “Shuhei Iitsuka”,
 1   tushuhei   Shuhei Iitsuka   friends: [“amachang”,
                                    “masall2”,
 2   amachang   Hitoshi Amano       “naofumiwa”,
                                    “phatsu”]}]
 3   masall2    Masahiro Saito


                                                           3
ファイルじゃダメなの?




 これとか       こんなかんじ

もちろんファイルでもOKです。ただ・・・


                       4
1.かんたん(統一性)

アプリケーションごとにファイル入出力の機
能をつくるのは面倒臭い。

DBならSQLで統一できる!

 SELECT, INSERT, DELETE




                          5
2.はやい(インデックス)
          たとえば id が 1 ∼ 31 のデータがあったとき、
          ある id のデータを探すには?

           1                                          16
           2
min: 1             min: 1                   8                   24
           3
max: 31            max: 5
           ...                      4            12        20        28
          30                    2       6       10 14 18 22 26 30
                            1       3 5 7 9 11 1315 1719 21 2325272931
           31
                                                <2分木探索>

      インデックスなし                       インデックスあり
                                                                          6
3.あんしん(アトミック性)
    たとえば INSERT 処理中にエラーが発生したら 

                           会員情報
for i = 0 to 100:   1        aaa     xxx
                    2        bbb     yyy
 hoge()
                    ...      ...     ...
 INSERT DATA        ...      ...     ...
 piyo()             37       LLL     ZZZ
endfor

  i=37のときにhoge()          中途半端な状態の
 でエラー発生、終了!!         データができてしまう。

                                           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
例1
id      name              items

                    “もろはのやいば”,
1     “tushuhei”        “やくそう”,
                    “まじっくすてっき”


                    “まじっくすてっき”,
2     “amachang”
                        “ぽーしょん”

...       ...              ...

                                  10
こんなときどうする?


「アイテムの名前が変更になった!」

 「やくそう」->「べほまぐさ」

ユーザのデータすべてに適用するの・・・?




                       11
例2
           users                    items
id     name        items     id      name

1    “tushuhei”    1, 2, 3   1    “もろはのやいば”

2    “amachang”     3, 4     2     “やくそう”

                             3 “まじっくすてっき”
     ここを変更すればOK
                             4     “ぽーしょん”



                                              12
こんなときどうする?

アイテム “もろはのやいば” を持っている人の一覧を
出したい!

このままだと、ユーザがアイテム追加時に面倒

 SELECT item FROM users WHERE id = xxx;

 $items = $items . “, yyy”;

 UPDATE users SET item = $items WHERE id = xxx;




                                                  13
例3
      users       user_item            item
id     name       user   item   id      name
1    “tushuhei”    1      1     1    “もろはのやいば”
2    “amachang”    1      2     2     “やくそう”
                   1      3     3 “まじっくすてっき”
                   2      3     4     “ぽーしょん”
                   2      4




                                                 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

【第3回初心者勉強会】データベースを使おう