SlideShare a Scribd company logo
1 of 28
Download to read offline
データベースを使おう




2013/02/23     1     UT Startup Gym
UT Startup Gym とは?



        アイデアをカタチにするプログラム

        l プロジェクト	
  
        l 企画から実装まで	
  
        l スタートアップ



2013/02/23            2           UT Startup Gym
スケジュール
                                                        Keywords:	
  

                • プログラミング入門               ソーシャルウェブアプリケーション,	
  API,	
  
   Oct,	
  12                             bot,	
  HTML5
              • プラニング
                                          リーンスタートアップ,	
  ビジネスプラニン
   Nov,	
  12 • プロジェクトスタート
                                          グ,	
  HTML,	
  CSS,	
  PHP,	
  javascript
              • 開発開始
   Dec,	
  12 • 冬季開発合宿                    チーム結成,	
  企画,	
  ディスカッション	
  
                                          git,	
  フレームワーク,	
  MySQL,	
  Apache	
  
              • ウェブデザイン
   Jan,	
  13 • 週間報告会
                                          シナリオ,	
  ペルソナ,	
  ワイヤフレーム,	
  	
  
                                          サイトマップ,	
  DB	
  スキーム	
  
                • jQuery,	
  中間発表
   Feb,	
  13
                                          ゲーミフィケーション,	
  仮説検証,	
  データマ
                                          イニング,	
  アクセシビリティ	
  
                • 作業会
   Mar,	
  13

                                          レスポンシブデザイン,	
  プレゼンテーション	
  
                • リリース会
   Apr,	
  13


2013/02/23                            3                                    UT Startup Gym
M	
 D	
 講師(敬称略) タイトル                             要素
        飯塚
 10	
 13	
            かんたん Facebook アプリをつくる      HTML, CSS, js	
            飯塚
          21	
        かんたん Twitter アプリをつくる       UNIX, vim, PHP	
          27 川上       かんたん アンケートフォームをつくる         MySQL, MVC
 11	
       AWS 高山様
           4	
        サーバを立てよう                   AWS
            飯塚・石村
          10	
        スタートアップの心構え                ビジネスプラン、リーンスタートアップ
            飯塚・佐藤
          17	
        プロダクトデザイン                  シナリオ、ペルソナ、ワイヤフレーム 
          24	
        お休み(飯塚@ジャカルタ)
 12	
       ゆーすけべー様 ウェブサービスの企画のコツ
           1	
                                   企画プロセス、ウェブサービス運用	
          8 飯塚        ウェブから情報をあつめる               クローラ, XPath, 正規表現
          15	
        プロジェクトキックオフ                アンカンファレンス	
          22 飯塚       チームで協力して開発するために            git
          飯塚
    1	
 13	
          かんたんキレイなウェブデザイン            Twitter Bootstrap, Web Fonts, LESS
            石村
          19	
        ゲーミフィケーション

            松尾、川上
          26	
        中間発表
    2	
    2	
        未定
            ぱろすけさん
           9	
        AV顔画像認識とその周辺               画像認識、機械学習
            松尾・川上
          16	
        中間発表会
    2 23 飯塚           データベース                     MySQL
                      作業                          
             
          27	
        リリース会                       
2013/02/23                                   4                                   UT Startup Gym
4/27(土)"
                 UT Startup Gym !
                   リリース会




2013/02/23   5               UT Startup Gym
今回使うデータ
•  データベース: MySQL
    –  RDBMS: Relational Database Management System
         •  SQL という言語でデータの出し入れをするシステム
    –  世界で最も普及しているオープンソースデータベース


•  データの中身: 架空の SNS
    –  ユーザー 約 50 万件
    –  会社情報 約 15 万件
    –  友人情報 約 1,000 万件




                                   MySQL – Wikipedia http://ja.wikipedia.org/wiki/MySQL
2013/02/23                     6                                       UT Startup Gym
テーブル設計

                    user                             friend
              id VARCHAR(128)               user_id VARCHAR(128)
             name VARCHAR(256)              friend_id VARCHAR(128)
        gender_id INT UNSIGNED"                  nakayoshi INT
              lang VARCHAR(10)"         PRIMARY KEY (user_id, friend_id)"
             created_at DATETIME"       UNIQUE KEY (friend_id, user_id)"
                     ..."
              PRIMARY KEY (id)"
                                                   company
                                           id BIGINT(20) UNSIGNED
                                             name VARCHAR(256)
                                               PRIMARY KEY (id)"




2013/02/23                          7                            UT Startup Gym
データベースを叩いてみよう
•  普通の SELECT 文"
  –  SELECT * FROM user LIMIT 10;"
  –  SELECT * FROM user;"
•  条件指定"
  –  SELECT * FROM user WHERE id = '109092915251428393573';"
  –  SELECT * FROM user WHERE name = ‘飯塚修平';"
  –  SELECT id, name FROM user WHERE created_at >
     DATE_SUB(NOW(), INTERVAL 10 MINUTE);"
•  同姓同名ランキング"
  –  SELECT user.name, COUNT(id) FROM user GROUP BY user.name
     ORDER BY COUNT(id) DESC LIMIT 10;"




 2013/02/23                     8                     UT Startup Gym
データベースを叩いてみよう
•  従業員数ランキング"
  –  SELECT company.id, company.name, COUNT(user_employment.id) FROM
     user_employment LEFT JOIN company ON user_employment.company_id =
     company.id GROUP BY company.id ORDER BY COUNT(user_employment.id)
     DESC LIMIT 10;"

•  Google の従業員一覧"
  –  SELECT user.id, user.name FROM user LEFT JOIN user_employment ON
     user.id = user_employment.user_id LEFT JOIN company ON
     user_employment.company_id = company.id WHERE company.name =
     'Google';"


•  共通の友達"
  –  SELECT * FROM friend AS f1 LEFT JOIN friend AS f2 ON f1.friend_id =
     f2.user_id WHERE f1.user_id = '109092915251428393573' AND f2.friend_id =
     '113100517422007103669’"

  2013/02/23                          9                          UT Startup Gym
SQL ムズい・・・
             そもそもなんでデータベースを
             使うの?




2013/02/23         10         UT Startup Gym
ファイルじゃダメなの?
   ファイルじゃダメなの?
             ぶっちゃけファイルでもよい。




             こんなのとか          こんなの
         これとか
         これとか              こんなかんじ
                           こんなかんじ

               ただ、データベースの利点がある
  もちろんファイルでもOKです。ただ・・・
  もちろんファイルでもOKです。ただ・・・
2013/02/23            11            UT Startup Gym
データベースの利点
•  SQL言語(かんたん)
    –  いちいち入出力書いてたら面倒
    –  SQL で統一的に記述できる!
         •  とはいえ方言はある (PostgreSQL, sqlite etc.)


•  インデックス(はやい)
    –  バイナリツリーによる探索速度向上
         •  詳しくは後述


•  トランザクション(あんしん)
    –  処理途中の中途半端な状態を許さない
    –  複数のクエリをひとつのユニットにまとめる
         •  失敗したらロールバック

2013/02/23                      12                 UT Startup Gym
インデックス
普通に探索すると

               SELECT name FROM user WHERE id = 1468;


  id = 1468"
 のやつが見つ              id       name
 かるまで探す              1        Shuhei	
  Iitsuka
     ぜ!
                     2        Kazuya	
  Kawakami
                     ...      ...
                     1468     Taro	
  Tanaka
                     ...      ...                       探索時間"
                                                         O(n)."
                                                        おそいね


2013/02/23                          13                     UT Startup Gym
インデックス
バイナリツリーのインデックスが張られていると

             SELECT name FROM user WHERE id = 1468;




 2分木探索で"                             1000
  探すぜ!
                         500                  1500

                   250         750         1250   1750

                                     ...                 探索時間
                                                         O(log(n))."
                                                         はやいね


2013/02/23                       14                          UT Startup Gym
データベースつかうといいこと
             は分かったけど、
             うちのサービスではどうすれ
             ばいいの?




2013/02/23         15         UT Startup Gym
テーブル設計をしてみよう
•  たとえばこんな RPG ゲームの戦闘データ
        –  どのバトルでどのユーザによってどんな技が繰り出されたか


battle_id	
   battle_at	
       attack_id	
   attack_name	
   attack_damage	
player_id	
   player_name	
 battle_type	
                                2	
           いあいぎり           30	
162	
         2013/2/22 10:00	
 2	
           いあいぎり           30	
           3	
           飯塚修平           normal	
                                5	
           ふぶき             80	
                                1	
           たいあたり           10	
161	
         2013/2/22 8:00	
                                               5	
           川上和也           boss	
                                2	
           いあいぎり           30	
                                4	
           そらをとぶ           40	
160	
         2013/2/21 23:00	
 4	
           そらをとぶ           40	
           5	
           川上和也           normal	
                                8	
           うたう             0	




この形では RDBMS に格納することは出来ない。




2013/02/23                                              16                                             UT Startup Gym
正規化
•  1 事実 1 カ所(1 fact in 1 place)を目指して、
   テーブルの整合性を保ったまま、テーブルの冗
   長性を排除して、データを効率的に管理できる
   ようにすること
    –  更新すべき項目の重複を防ぐことができる
         •  あんなところやこんなところに「○○」が!




      データベースエンジニアへの道 – @IT http://www.atmarkit.co.jp/fdb/rensai/db_enginer03/db_enginer03_1.html

2013/02/23                                   17                                   UT Startup Gym
第1正規形
     -­‐	
  テーブルにキーを設定する
     -­‐	
  テーブルの繰り返しグループを別のテーブルに分離する
     -­‐	
  導出項目を削除する


                                 battle_id	
   battle_at	
         attack_id	
        attack_name	
   attack_damage	
                                 162	
            2013/2/22 10:00	
2	
                いあいぎり           30	
                                 162	
            2013/2/22 10:00	
2	
                いあいぎり           30	
                                 162	
            2013/2/22 10:00	
5	
                ふぶき             80	
                    battle	
     161	
              2013/2/22 8:00	
                                                                   1	
                たいあたり           10	
                    attack       161	
              2013/2/22 8:00	
                                                                   2	
                いあいぎり           30	
                                 160	
            2013/2/21 23:00	
4	
                そらをとぶ           40	
key:	
  battle_id                160	
            2013/2/21 23:00	
4	
                そらをとぶ           40	
                                 160	
            2013/2/21 23:00	
8	
                うたう             0	



                                 battle_id	
   player_id	
    player_name	
      battle_type	
                                 162	
         3	
            飯塚修平               normal	
                    player       161	
         5	
            川上和也               boss	
                                 160	
         5	
            川上和也               normal	



   2013/02/23                                  18                                                UT Startup Gym
技名「いあいぎり」を「ばっとうぎり」にしたい!




                   battle_id	
 battle_at	
         attack_id	
                attack_name	
   attack_damage	
                   162	
          2013/2/22 10:00	
2	
                        いあいぎり           30	
                   162	
          2013/2/22 10:00	
2	
                        いあいぎり           30	
                   162	
          2013/2/22 10:00	
5	
                        ふぶき             80	
                   161	
            2013/2/22 8:00	
                                                   1	
                        たいあたり           10	
             変更箇所が複数にまたがってしまう!
                   161	
            2013/2/22 8:00	
                                                   2	
                        いあいぎり           30	
                   160	
          2013/2/21 23:00	
4	
                        そらをとぶ           40	
                   160	
          2013/2/21 23:00	
4	
                        そらをとぶ           40	
                   160	
          2013/2/21 23:00	
8	
                        うたう             0	



                             battle_id	
   player_id	
   player_name	
   battle_type	
                             162	
         3	
           飯塚修平            normal	
                             161	
         5	
           川上和也            boss	
                             160	
         5	
           川上和也            normal	



2013/02/23                                 19                                            UT Startup Gym
第2正規形
第1正規形から部分関数従属性を取り除くこと"
ex. 「attack_id = 1 」→「たいあたり」



battle_id	
   battle_at	
         player_id	
   player_name	
   battle_type	
162	
            2013/2/22 10:00	
3	
           飯塚修平            normal	
161	
              2013/2/22 8:00	
                                  5	
           川上和也            boss	
160	
            2013/2/21 23:00	
5	
           川上和也            normal	

                                                                                変更箇所が1箇所で済む
battle_id	
   attack_id	
    num	
              attack_id	
     attack_name	
   attack_damage	
162	
         2	
            2	
                1	
             たいあたり           10	
162	
         5	
            1	
                2	
             いあいぎり           30	
161	
         1	
            1	
                4	
             そらをとぶ           40	
161	
         2	
            1	
                5	
             ふぶき             80	
160	
         4	
            2	
                8	
             うたう             0	
160	
         8	
            1	




                                                       20                                         UT Startup Gym
まだバトルをしていないプレイヤーが	
  
      登録したんだけど・・・	
  



                                                                どこに入れればいいの・・・?

battle_id	
   battle_at	
         player_id	
   player_name	
   battle_type	
162	
            2013/2/22 10:00	
3	
           飯塚修平            normal	
161	
              2013/2/22 8:00	
                                  5	
           川上和也            boss	
160	
            2013/2/21 23:00	
5	
           川上和也            normal	




battle_id	
   attack_id	
    num	
              attack_id	
     attack_name	
   attack_damage	
162	
         2	
            2	
                1	
             たいあたり           10	
162	
         5	
            1	
                2	
             いあいぎり           30	
161	
         1	
            1	
                4	
             そらをとぶ           40	
161	
         2	
            1	
                5	
             ふぶき             80	
160	
         4	
            2	
                8	
             うたう             0	
160	
         8	
            1	




                                                       21                                         UT Startup Gym
第3正規形
第2正規形から推移関数従属性を取り除くこと"
ex. 「battle_id = 162 」→「player_id = 3」→「飯塚修平」


                             battle                                                 player
battle_id	
   battle_at	
         player_id	
     battle_type	
       player_id	
       player_name	
162	
            2013/2/22 10:00	
              3	
                                                  normal	
                            3	
                                                                                        飯塚修平
161	
              2013/2/22 8:00	
             5	
                                                  boss	
                              5	
                                                                                        川上和也
160	
            2013/2/21 23:00	
              5	
                                                  normal	


              battle_attack                                        attack
battle_id	
   attack_id	
    num	
               attack_id	
      attack_name	
 attack_damage	
162	
         2	
            2	
                 1	
              たいあたり 10	
未バトルのプレイヤーを	
  
162	
         5	
            1	
                 2	
                マスタに追加しておくことができる
                                                                  いあいぎり 30	
161	
         1	
            1	
                 4	
              そらをとぶ 40	
161	
         2	
            1	
                 5	
              ふぶき           80	
160	
         4	
            2	
                 8	
              うたう           0	
160	
         8	
            1	




                                                        22                                              UT Startup Gym
実際に使うときは
•  LEFT JOIN でくっつけていく"
•  もっとも使われている技名ランキング"
    –  SELECT ba.attack_id, SUM(ba.num) FROM battle_attack ba
       GROUP BY ba.attack_id;"
    –  やっぱり技名も欲しい・・・→ LEFT JOIN attack"
    –  SELECT a.attack_name, SUM(ba.num) FROM battle_attack ba
       LEFT JOIN attack a ON ba.attack_id = a.attack_id GROUP BY
       ba.attack_id;"




2013/02/23                     23                       UT Startup Gym
さきほどの例なら
•    Google の従業員一覧"
•    まず Google が ID = なんちゃらだとして"
     –  SELECT user_id 

        FROM user_employment 

        WHERE company_id = なんちゃら;"
•    社名で指定したいので LEFT JOIN company"
     –  SELECT user_id 

        FROM user_employment ue 

        LEFT JOIN company c ON ue.company_id = c.id 

        WHERE c.name = 'Google';"
•    さらに従業員の名前を出したいので LEFT JOIN user"
     –  SELECT u.id, u.name 

        FROM user_employment ue 

        LEFT JOIN company c ON ue.company_id = c.id 

        LEFT JOIN user u ON ue.user_id = u.id 

        WHERE c.name = 'Google';"




2013/02/23                             24               UT Startup Gym
実際の設計の手順
•  正規化は、冗長なところがないかをチェックするための
   もの。
•  設計時はエンティティを考えて、それらの関係を考えて
   いく。
    –  エンティティ→マスターテーブル
    –  関係→トランザクションテーブル
•  たとえば掲示板サイトなら
    –  マスタ
         •  スレッドマスタ
         •  コメントマスタ
         •  ユーザマスタ(匿名性なら不要)
    –  トランザクション
         •  投稿テーブル(誰が、どのスレッドに、なんというコメントをしたか)


2013/02/23               25             UT Startup Gym
2013/02/23   26   UT Startup Gym
チューニング
•  高速にデータを取得するためにインデックスを張る、SQL を書き換
   えるなどの工夫をする。
•  EXPLAIN コマンド
    –  詳細は http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
•  サブクエリは使わない
    –  詳細は http://nippondanji.blogspot.jp/2009/03/mysql_25.html




2013/02/23                             27                              UT Startup Gym
参考文献
•    データベースを使おう @UT Startup Gym by @amachang

     http://www.slideshare.net/tushuhei/ss-16506218
•    第3回 素早く正規形を見抜く実践テクニック – @IT

     http://www.atmarkit.co.jp/fdb/rensai/db_enginer03/db_enginer03_1.html
•    MySQLのEXPLAINを徹底解説!! – 漢のコンピュータ道

     http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
•    なぜMySQLのサブクエリは遅いのか。 – 漢のコンピュータ道

     http://nippondanji.blogspot.jp/2009/03/mysql_25.html




2013/02/23                            28                           UT Startup Gym

More Related Content

What's hot

お見合いで趣味を聞かれたときに 「IoTとビッグデータを少々」と答えたいSEが読む資料
お見合いで趣味を聞かれたときに 「IoTとビッグデータを少々」と答えたいSEが読む資料お見合いで趣味を聞かれたときに 「IoTとビッグデータを少々」と答えたいSEが読む資料
お見合いで趣味を聞かれたときに 「IoTとビッグデータを少々」と答えたいSEが読む資料Monta Yashi
 
20201102 postgresql unconference_debility
20201102 postgresql unconference_debility20201102 postgresql unconference_debility
20201102 postgresql unconference_debilitySatoshi Hirata
 
JAZUG女子部 第2回勉強会 ハンズオン
JAZUG女子部 第2回勉強会 ハンズオンJAZUG女子部 第2回勉強会 ハンズオン
JAZUG女子部 第2回勉強会 ハンズオンKana SUZUKI
 
Windows azureって何
Windows azureって何Windows azureって何
Windows azureって何Kana SUZUKI
 
MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎Naruhiko Ogasawara
 
My sqlで2億件のシリアルデータと格闘した話
My sqlで2億件のシリアルデータと格闘した話My sqlで2億件のシリアルデータと格闘した話
My sqlで2億件のシリアルデータと格闘した話saiken3110
 
はじめての検索エンジン&Solr 第13回Solr勉強会
はじめての検索エンジン&Solr 第13回Solr勉強会はじめての検索エンジン&Solr 第13回Solr勉強会
はじめての検索エンジン&Solr 第13回Solr勉強会Noritsugu Suzuki
 
Elasticsearch 変わり種プラグインの作り方
Elasticsearch 変わり種プラグインの作り方Elasticsearch 変わり種プラグインの作り方
Elasticsearch 変わり種プラグインの作り方Ryoji Kurosawa
 
ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回Naoyuki Yamada
 
AmebaのMongoDB活用事例
AmebaのMongoDB活用事例AmebaのMongoDB活用事例
AmebaのMongoDB活用事例Akihiro Kuwano
 
MySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearchMySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearchKentaro Yoshida
 
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"Kentaro Yoshida
 
Yokozuna 日本語検索機能を評価しました
Yokozuna 日本語検索機能を評価しましたYokozuna 日本語検索機能を評価しました
Yokozuna 日本語検索機能を評価しましたTakashi Sogabe
 
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeOsc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeToshi Harada
 
20131113_mysql_on_分散fsセミナー資料
20131113_mysql_on_分散fsセミナー資料20131113_mysql_on_分散fsセミナー資料
20131113_mysql_on_分散fsセミナー資料Takahiro Iwase
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜Naruhiko Ogasawara
 
Elasticsearch at CrowdWorks
Elasticsearch at CrowdWorksElasticsearch at CrowdWorks
Elasticsearch at CrowdWorks佑介 九岡
 
MongoDBのアレをアレする
MongoDBのアレをアレするMongoDBのアレをアレする
MongoDBのアレをアレするAkihiro Kuwano
 
新しくなったPg monzでpostgre sqlのクラスタを監視しよう
新しくなったPg monzでpostgre sqlのクラスタを監視しよう新しくなったPg monzでpostgre sqlのクラスタを監視しよう
新しくなったPg monzでpostgre sqlのクラスタを監視しようYoshinori Nakanishi
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 

What's hot (20)

お見合いで趣味を聞かれたときに 「IoTとビッグデータを少々」と答えたいSEが読む資料
お見合いで趣味を聞かれたときに 「IoTとビッグデータを少々」と答えたいSEが読む資料お見合いで趣味を聞かれたときに 「IoTとビッグデータを少々」と答えたいSEが読む資料
お見合いで趣味を聞かれたときに 「IoTとビッグデータを少々」と答えたいSEが読む資料
 
20201102 postgresql unconference_debility
20201102 postgresql unconference_debility20201102 postgresql unconference_debility
20201102 postgresql unconference_debility
 
JAZUG女子部 第2回勉強会 ハンズオン
JAZUG女子部 第2回勉強会 ハンズオンJAZUG女子部 第2回勉強会 ハンズオン
JAZUG女子部 第2回勉強会 ハンズオン
 
Windows azureって何
Windows azureって何Windows azureって何
Windows azureって何
 
MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎
 
My sqlで2億件のシリアルデータと格闘した話
My sqlで2億件のシリアルデータと格闘した話My sqlで2億件のシリアルデータと格闘した話
My sqlで2億件のシリアルデータと格闘した話
 
はじめての検索エンジン&Solr 第13回Solr勉強会
はじめての検索エンジン&Solr 第13回Solr勉強会はじめての検索エンジン&Solr 第13回Solr勉強会
はじめての検索エンジン&Solr 第13回Solr勉強会
 
Elasticsearch 変わり種プラグインの作り方
Elasticsearch 変わり種プラグインの作り方Elasticsearch 変わり種プラグインの作り方
Elasticsearch 変わり種プラグインの作り方
 
ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回
 
AmebaのMongoDB活用事例
AmebaのMongoDB活用事例AmebaのMongoDB活用事例
AmebaのMongoDB活用事例
 
MySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearchMySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearch
 
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
 
Yokozuna 日本語検索機能を評価しました
Yokozuna 日本語検索機能を評価しましたYokozuna 日本語検索機能を評価しました
Yokozuna 日本語検索機能を評価しました
 
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeOsc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatype
 
20131113_mysql_on_分散fsセミナー資料
20131113_mysql_on_分散fsセミナー資料20131113_mysql_on_分散fsセミナー資料
20131113_mysql_on_分散fsセミナー資料
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
 
Elasticsearch at CrowdWorks
Elasticsearch at CrowdWorksElasticsearch at CrowdWorks
Elasticsearch at CrowdWorks
 
MongoDBのアレをアレする
MongoDBのアレをアレするMongoDBのアレをアレする
MongoDBのアレをアレする
 
新しくなったPg monzでpostgre sqlのクラスタを監視しよう
新しくなったPg monzでpostgre sqlのクラスタを監視しよう新しくなったPg monzでpostgre sqlのクラスタを監視しよう
新しくなったPg monzでpostgre sqlのクラスタを監視しよう
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 

Similar to データベースを使おう

かんたん Twitter アプリをつくろう
かんたん Twitter アプリをつくろう かんたん Twitter アプリをつくろう
かんたん Twitter アプリをつくろう Shuhei Iitsuka
 
かんたんキレイなウェブデザイン
かんたんキレイなウェブデザインかんたんキレイなウェブデザイン
かんたんキレイなウェブデザインShuhei Iitsuka
 
ウェブから情報をあつめる
ウェブから情報をあつめるウェブから情報をあつめる
ウェブから情報をあつめるShuhei Iitsuka
 
【第3回初心者勉強会】データベースを使おう
【第3回初心者勉強会】データベースを使おう【第3回初心者勉強会】データベースを使おう
【第3回初心者勉強会】データベースを使おうShuhei Iitsuka
 
ペルソナシナリオとプロトタイプ2
ペルソナシナリオとプロトタイプ2ペルソナシナリオとプロトタイプ2
ペルソナシナリオとプロトタイプ2Shuhei Iitsuka
 
できる!KickstartとAnsible!
できる!KickstartとAnsible!できる!KickstartとAnsible!
できる!KickstartとAnsible!Wataru NOGUCHI
 
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部Daisuke Nagao
 
使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!IIJ
 
2015年2月26日 dsthHUB 『DataSpiderインターナル プラガブルアーキテクチャで広がる可能性』
2015年2月26日 dsthHUB 『DataSpiderインターナル プラガブルアーキテクチャで広がる可能性』2015年2月26日 dsthHUB 『DataSpiderインターナル プラガブルアーキテクチャで広がる可能性』
2015年2月26日 dsthHUB 『DataSpiderインターナル プラガブルアーキテクチャで広がる可能性』dstn
 
ベアメタルOpenStackで始めるクラウド環境構築
ベアメタルOpenStackで始めるクラウド環境構築ベアメタルOpenStackで始めるクラウド環境構築
ベアメタルOpenStackで始めるクラウド環境構築Nobuyuki Tamaoki
 
PPT Full version: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう
PPT Full version: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみようPPT Full version: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう
PPT Full version: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみようDaisuke Masubuchi
 
PDF版 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう Db tech showcase2020
PDF版 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう Db tech showcase2020PDF版 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう Db tech showcase2020
PDF版 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう Db tech showcase2020Daisuke Masubuchi
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
Elasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバElasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバShinsuke Sugaya
 
Osc spring 20220311
Osc spring 20220311Osc spring 20220311
Osc spring 20220311Yasuaki Sera
 
Tips for passing AZ-103 once
Tips for passing AZ-103 onceTips for passing AZ-103 once
Tips for passing AZ-103 onceOshitari_kochi
 
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話真治 米田
 
IT技術者でも1から学べるビジネスモデルキャンバス入門
IT技術者でも1から学べるビジネスモデルキャンバス入門IT技術者でも1から学べるビジネスモデルキャンバス入門
IT技術者でも1から学べるビジネスモデルキャンバス入門陽一 滝川
 

Similar to データベースを使おう (20)

かんたん Twitter アプリをつくろう
かんたん Twitter アプリをつくろう かんたん Twitter アプリをつくろう
かんたん Twitter アプリをつくろう
 
かんたんキレイなウェブデザイン
かんたんキレイなウェブデザインかんたんキレイなウェブデザイン
かんたんキレイなウェブデザイン
 
Git
GitGit
Git
 
ウェブから情報をあつめる
ウェブから情報をあつめるウェブから情報をあつめる
ウェブから情報をあつめる
 
【第3回初心者勉強会】データベースを使おう
【第3回初心者勉強会】データベースを使おう【第3回初心者勉強会】データベースを使おう
【第3回初心者勉強会】データベースを使おう
 
ペルソナシナリオとプロトタイプ2
ペルソナシナリオとプロトタイプ2ペルソナシナリオとプロトタイプ2
ペルソナシナリオとプロトタイプ2
 
できる!KickstartとAnsible!
できる!KickstartとAnsible!できる!KickstartとAnsible!
できる!KickstartとAnsible!
 
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
 
使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!
 
2015年2月26日 dsthHUB 『DataSpiderインターナル プラガブルアーキテクチャで広がる可能性』
2015年2月26日 dsthHUB 『DataSpiderインターナル プラガブルアーキテクチャで広がる可能性』2015年2月26日 dsthHUB 『DataSpiderインターナル プラガブルアーキテクチャで広がる可能性』
2015年2月26日 dsthHUB 『DataSpiderインターナル プラガブルアーキテクチャで広がる可能性』
 
ベアメタルOpenStackで始めるクラウド環境構築
ベアメタルOpenStackで始めるクラウド環境構築ベアメタルOpenStackで始めるクラウド環境構築
ベアメタルOpenStackで始めるクラウド環境構築
 
PPT Full version: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう
PPT Full version: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみようPPT Full version: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう
PPT Full version: 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう
 
PDF版 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう Db tech showcase2020
PDF版 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう Db tech showcase2020PDF版 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう Db tech showcase2020
PDF版 世界中のゲーム分析をしてきたPlayFabが大進化!一緒に裏側の最新データ探索の仕組みを覗いてみよう Db tech showcase2020
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
Elasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバElasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバ
 
Osc spring 20220311
Osc spring 20220311Osc spring 20220311
Osc spring 20220311
 
Tips for passing AZ-103 once
Tips for passing AZ-103 onceTips for passing AZ-103 once
Tips for passing AZ-103 once
 
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
 
IT技術者でも1から学べるビジネスモデルキャンバス入門
IT技術者でも1から学べるビジネスモデルキャンバス入門IT技術者でも1から学べるビジネスモデルキャンバス入門
IT技術者でも1から学べるビジネスモデルキャンバス入門
 

More from Shuhei Iitsuka

Online and offline handwritten chinese character recognition a comprehensive...
Online and offline handwritten chinese character recognition  a comprehensive...Online and offline handwritten chinese character recognition  a comprehensive...
Online and offline handwritten chinese character recognition a comprehensive...Shuhei Iitsuka
 
Inferring win–lose product network from user behavior
Inferring win–lose product network from user behaviorInferring win–lose product network from user behavior
Inferring win–lose product network from user behaviorShuhei Iitsuka
 
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会Shuhei Iitsuka
 
Procedural modeling using autoencoder networks
Procedural modeling using autoencoder networksProcedural modeling using autoencoder networks
Procedural modeling using autoencoder networksShuhei Iitsuka
 
Generating sentences from a continuous space
Generating sentences from a continuous spaceGenerating sentences from a continuous space
Generating sentences from a continuous spaceShuhei Iitsuka
 
ウェブサイト最適化のためのバリエーション自動生成システム
ウェブサイト最適化のためのバリエーション自動生成システムウェブサイト最適化のためのバリエーション自動生成システム
ウェブサイト最適化のためのバリエーション自動生成システムShuhei Iitsuka
 
Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...
Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...
Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...Shuhei Iitsuka
 
Machine learning meets web development
Machine learning meets web developmentMachine learning meets web development
Machine learning meets web developmentShuhei Iitsuka
 
Python と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめるPython と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめるShuhei Iitsuka
 
リミックスからはじめる DTM 入門
リミックスからはじめる DTM 入門リミックスからはじめる DTM 入門
リミックスからはじめる DTM 入門Shuhei Iitsuka
 
【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...
【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...
【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...Shuhei Iitsuka
 
Asia Trend Map: Forecasting “Cool Japan” Content Popularity on Web Data
Asia Trend Map: Forecasting “Cool Japan” Content Popularity on Web DataAsia Trend Map: Forecasting “Cool Japan” Content Popularity on Web Data
Asia Trend Map: Forecasting “Cool Japan” Content Popularity on Web DataShuhei Iitsuka
 
【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule
【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule
【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ RuleShuhei Iitsuka
 
UT Startup Gym で人生が変わった話
UT Startup Gym で人生が変わった話UT Startup Gym で人生が変わった話
UT Startup Gym で人生が変わった話Shuhei Iitsuka
 
ウェブサイトで収益を得る
ウェブサイトで収益を得るウェブサイトで収益を得る
ウェブサイトで収益を得るShuhei Iitsuka
 
HTML で自己紹介ページをつくる
HTML で自己紹介ページをつくるHTML で自己紹介ページをつくる
HTML で自己紹介ページをつくるShuhei Iitsuka
 
ウェブサービスの企画とデザイン
ウェブサービスの企画とデザインウェブサービスの企画とデザイン
ウェブサービスの企画とデザインShuhei Iitsuka
 
データベースを使おう
データベースを使おうデータベースを使おう
データベースを使おうShuhei Iitsuka
 
第3期キックオフ説明会+勉強会
第3期キックオフ説明会+勉強会 第3期キックオフ説明会+勉強会
第3期キックオフ説明会+勉強会 Shuhei Iitsuka
 
ペルソナシナリオとプロトタイプ
ペルソナシナリオとプロトタイプペルソナシナリオとプロトタイプ
ペルソナシナリオとプロトタイプShuhei Iitsuka
 

More from Shuhei Iitsuka (20)

Online and offline handwritten chinese character recognition a comprehensive...
Online and offline handwritten chinese character recognition  a comprehensive...Online and offline handwritten chinese character recognition  a comprehensive...
Online and offline handwritten chinese character recognition a comprehensive...
 
Inferring win–lose product network from user behavior
Inferring win–lose product network from user behaviorInferring win–lose product network from user behavior
Inferring win–lose product network from user behavior
 
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会
 
Procedural modeling using autoencoder networks
Procedural modeling using autoencoder networksProcedural modeling using autoencoder networks
Procedural modeling using autoencoder networks
 
Generating sentences from a continuous space
Generating sentences from a continuous spaceGenerating sentences from a continuous space
Generating sentences from a continuous space
 
ウェブサイト最適化のためのバリエーション自動生成システム
ウェブサイト最適化のためのバリエーション自動生成システムウェブサイト最適化のためのバリエーション自動生成システム
ウェブサイト最適化のためのバリエーション自動生成システム
 
Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...
Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...
Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...
 
Machine learning meets web development
Machine learning meets web developmentMachine learning meets web development
Machine learning meets web development
 
Python と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめるPython と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめる
 
リミックスからはじめる DTM 入門
リミックスからはじめる DTM 入門リミックスからはじめる DTM 入門
リミックスからはじめる DTM 入門
 
【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...
【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...
【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...
 
Asia Trend Map: Forecasting “Cool Japan” Content Popularity on Web Data
Asia Trend Map: Forecasting “Cool Japan” Content Popularity on Web DataAsia Trend Map: Forecasting “Cool Japan” Content Popularity on Web Data
Asia Trend Map: Forecasting “Cool Japan” Content Popularity on Web Data
 
【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule
【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule
【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule
 
UT Startup Gym で人生が変わった話
UT Startup Gym で人生が変わった話UT Startup Gym で人生が変わった話
UT Startup Gym で人生が変わった話
 
ウェブサイトで収益を得る
ウェブサイトで収益を得るウェブサイトで収益を得る
ウェブサイトで収益を得る
 
HTML で自己紹介ページをつくる
HTML で自己紹介ページをつくるHTML で自己紹介ページをつくる
HTML で自己紹介ページをつくる
 
ウェブサービスの企画とデザイン
ウェブサービスの企画とデザインウェブサービスの企画とデザイン
ウェブサービスの企画とデザイン
 
データベースを使おう
データベースを使おうデータベースを使おう
データベースを使おう
 
第3期キックオフ説明会+勉強会
第3期キックオフ説明会+勉強会 第3期キックオフ説明会+勉強会
第3期キックオフ説明会+勉強会
 
ペルソナシナリオとプロトタイプ
ペルソナシナリオとプロトタイプペルソナシナリオとプロトタイプ
ペルソナシナリオとプロトタイプ
 

データベースを使おう

  • 2. UT Startup Gym とは? アイデアをカタチにするプログラム l プロジェクト   l 企画から実装まで   l スタートアップ 2013/02/23 2 UT Startup Gym
  • 3. スケジュール Keywords:   • プログラミング入門 ソーシャルウェブアプリケーション,  API,   Oct,  12 bot,  HTML5 • プラニング リーンスタートアップ,  ビジネスプラニン Nov,  12 • プロジェクトスタート グ,  HTML,  CSS,  PHP,  javascript • 開発開始 Dec,  12 • 冬季開発合宿 チーム結成,  企画,  ディスカッション   git,  フレームワーク,  MySQL,  Apache   • ウェブデザイン Jan,  13 • 週間報告会 シナリオ,  ペルソナ,  ワイヤフレーム,     サイトマップ,  DB  スキーム   • jQuery,  中間発表 Feb,  13 ゲーミフィケーション,  仮説検証,  データマ イニング,  アクセシビリティ   • 作業会 Mar,  13 レスポンシブデザイン,  プレゼンテーション   • リリース会 Apr,  13 2013/02/23 3 UT Startup Gym
  • 4. M D 講師(敬称略) タイトル 要素 飯塚 10 13 かんたん Facebook アプリをつくる HTML, CSS, js   飯塚 21 かんたん Twitter アプリをつくる UNIX, vim, PHP   27 川上 かんたん アンケートフォームをつくる MySQL, MVC 11 AWS 高山様 4 サーバを立てよう AWS   飯塚・石村 10 スタートアップの心構え ビジネスプラン、リーンスタートアップ   飯塚・佐藤 17 プロダクトデザイン シナリオ、ペルソナ、ワイヤフレーム    24 お休み(飯塚@ジャカルタ) 12 ゆーすけべー様 ウェブサービスの企画のコツ 1 企画プロセス、ウェブサービス運用   8 飯塚 ウェブから情報をあつめる クローラ, XPath, 正規表現   15 プロジェクトキックオフ アンカンファレンス   22 飯塚 チームで協力して開発するために git 飯塚 1 13 かんたんキレイなウェブデザイン Twitter Bootstrap, Web Fonts, LESS   石村 19 ゲーミフィケーション   松尾、川上 26 中間発表 2 2 未定   ぱろすけさん 9 AV顔画像認識とその周辺 画像認識、機械学習   松尾・川上 16 中間発表会 2 23 飯塚  データベース MySQL   作業       27 リリース会   2013/02/23 4 UT Startup Gym
  • 5. 4/27(土)" UT Startup Gym ! リリース会 2013/02/23 5 UT Startup Gym
  • 6. 今回使うデータ •  データベース: MySQL –  RDBMS: Relational Database Management System •  SQL という言語でデータの出し入れをするシステム –  世界で最も普及しているオープンソースデータベース •  データの中身: 架空の SNS –  ユーザー 約 50 万件 –  会社情報 約 15 万件 –  友人情報 約 1,000 万件 MySQL – Wikipedia http://ja.wikipedia.org/wiki/MySQL 2013/02/23 6 UT Startup Gym
  • 7. テーブル設計 user friend id VARCHAR(128) user_id VARCHAR(128) name VARCHAR(256) friend_id VARCHAR(128) gender_id INT UNSIGNED" nakayoshi INT lang VARCHAR(10)" PRIMARY KEY (user_id, friend_id)" created_at DATETIME" UNIQUE KEY (friend_id, user_id)" ..." PRIMARY KEY (id)" company id BIGINT(20) UNSIGNED name VARCHAR(256) PRIMARY KEY (id)" 2013/02/23 7 UT Startup Gym
  • 8. データベースを叩いてみよう •  普通の SELECT 文" –  SELECT * FROM user LIMIT 10;" –  SELECT * FROM user;" •  条件指定" –  SELECT * FROM user WHERE id = '109092915251428393573';" –  SELECT * FROM user WHERE name = ‘飯塚修平';" –  SELECT id, name FROM user WHERE created_at > DATE_SUB(NOW(), INTERVAL 10 MINUTE);" •  同姓同名ランキング" –  SELECT user.name, COUNT(id) FROM user GROUP BY user.name ORDER BY COUNT(id) DESC LIMIT 10;" 2013/02/23 8 UT Startup Gym
  • 9. データベースを叩いてみよう •  従業員数ランキング" –  SELECT company.id, company.name, COUNT(user_employment.id) FROM user_employment LEFT JOIN company ON user_employment.company_id = company.id GROUP BY company.id ORDER BY COUNT(user_employment.id) DESC LIMIT 10;" •  Google の従業員一覧" –  SELECT user.id, user.name FROM user LEFT JOIN user_employment ON user.id = user_employment.user_id LEFT JOIN company ON user_employment.company_id = company.id WHERE company.name = 'Google';" •  共通の友達" –  SELECT * FROM friend AS f1 LEFT JOIN friend AS f2 ON f1.friend_id = f2.user_id WHERE f1.user_id = '109092915251428393573' AND f2.friend_id = '113100517422007103669’" 2013/02/23 9 UT Startup Gym
  • 10. SQL ムズい・・・ そもそもなんでデータベースを 使うの? 2013/02/23 10 UT Startup Gym
  • 11. ファイルじゃダメなの? ファイルじゃダメなの? ぶっちゃけファイルでもよい。 こんなのとか こんなの これとか これとか こんなかんじ こんなかんじ ただ、データベースの利点がある もちろんファイルでもOKです。ただ・・・ もちろんファイルでもOKです。ただ・・・ 2013/02/23 11 UT Startup Gym
  • 12. データベースの利点 •  SQL言語(かんたん) –  いちいち入出力書いてたら面倒 –  SQL で統一的に記述できる! •  とはいえ方言はある (PostgreSQL, sqlite etc.) •  インデックス(はやい) –  バイナリツリーによる探索速度向上 •  詳しくは後述 •  トランザクション(あんしん) –  処理途中の中途半端な状態を許さない –  複数のクエリをひとつのユニットにまとめる •  失敗したらロールバック 2013/02/23 12 UT Startup Gym
  • 13. インデックス 普通に探索すると SELECT name FROM user WHERE id = 1468; id = 1468" のやつが見つ id name かるまで探す 1 Shuhei  Iitsuka ぜ! 2 Kazuya  Kawakami ... ... 1468 Taro  Tanaka ... ... 探索時間" O(n)." おそいね 2013/02/23 13 UT Startup Gym
  • 14. インデックス バイナリツリーのインデックスが張られていると SELECT name FROM user WHERE id = 1468; 2分木探索で" 1000 探すぜ! 500 1500 250 750 1250 1750 ... 探索時間 O(log(n))." はやいね 2013/02/23 14 UT Startup Gym
  • 15. データベースつかうといいこと は分かったけど、 うちのサービスではどうすれ ばいいの? 2013/02/23 15 UT Startup Gym
  • 16. テーブル設計をしてみよう •  たとえばこんな RPG ゲームの戦闘データ –  どのバトルでどのユーザによってどんな技が繰り出されたか battle_id battle_at attack_id attack_name attack_damage player_id player_name battle_type 2 いあいぎり 30 162 2013/2/22 10:00 2 いあいぎり 30 3 飯塚修平 normal 5 ふぶき 80 1 たいあたり 10 161 2013/2/22 8:00 5 川上和也 boss 2 いあいぎり 30 4 そらをとぶ 40 160 2013/2/21 23:00 4 そらをとぶ 40 5 川上和也 normal 8 うたう 0 この形では RDBMS に格納することは出来ない。 2013/02/23 16 UT Startup Gym
  • 17. 正規化 •  1 事実 1 カ所(1 fact in 1 place)を目指して、 テーブルの整合性を保ったまま、テーブルの冗 長性を排除して、データを効率的に管理できる ようにすること –  更新すべき項目の重複を防ぐことができる •  あんなところやこんなところに「○○」が! データベースエンジニアへの道 – @IT http://www.atmarkit.co.jp/fdb/rensai/db_enginer03/db_enginer03_1.html 2013/02/23 17 UT Startup Gym
  • 18. 第1正規形 -­‐  テーブルにキーを設定する -­‐  テーブルの繰り返しグループを別のテーブルに分離する -­‐  導出項目を削除する battle_id battle_at attack_id attack_name attack_damage 162 2013/2/22 10:00 2 いあいぎり 30 162 2013/2/22 10:00 2 いあいぎり 30 162 2013/2/22 10:00 5 ふぶき 80 battle   161 2013/2/22 8:00 1 たいあたり 10 attack 161 2013/2/22 8:00 2 いあいぎり 30 160 2013/2/21 23:00 4 そらをとぶ 40 key:  battle_id 160 2013/2/21 23:00 4 そらをとぶ 40 160 2013/2/21 23:00 8 うたう 0 battle_id player_id player_name battle_type 162 3 飯塚修平 normal player 161 5 川上和也 boss 160 5 川上和也 normal 2013/02/23 18 UT Startup Gym
  • 19. 技名「いあいぎり」を「ばっとうぎり」にしたい! battle_id battle_at attack_id attack_name attack_damage 162 2013/2/22 10:00 2 いあいぎり 30 162 2013/2/22 10:00 2 いあいぎり 30 162 2013/2/22 10:00 5 ふぶき 80 161 2013/2/22 8:00 1 たいあたり 10 変更箇所が複数にまたがってしまう! 161 2013/2/22 8:00 2 いあいぎり 30 160 2013/2/21 23:00 4 そらをとぶ 40 160 2013/2/21 23:00 4 そらをとぶ 40 160 2013/2/21 23:00 8 うたう 0 battle_id player_id player_name battle_type 162 3 飯塚修平 normal 161 5 川上和也 boss 160 5 川上和也 normal 2013/02/23 19 UT Startup Gym
  • 20. 第2正規形 第1正規形から部分関数従属性を取り除くこと" ex. 「attack_id = 1 」→「たいあたり」 battle_id battle_at player_id player_name battle_type 162 2013/2/22 10:00 3 飯塚修平 normal 161 2013/2/22 8:00 5 川上和也 boss 160 2013/2/21 23:00 5 川上和也 normal 変更箇所が1箇所で済む battle_id attack_id num attack_id attack_name attack_damage 162 2 2 1 たいあたり 10 162 5 1 2 いあいぎり 30 161 1 1 4 そらをとぶ 40 161 2 1 5 ふぶき 80 160 4 2 8 うたう 0 160 8 1 20 UT Startup Gym
  • 21. まだバトルをしていないプレイヤーが   登録したんだけど・・・   どこに入れればいいの・・・? battle_id battle_at player_id player_name battle_type 162 2013/2/22 10:00 3 飯塚修平 normal 161 2013/2/22 8:00 5 川上和也 boss 160 2013/2/21 23:00 5 川上和也 normal battle_id attack_id num attack_id attack_name attack_damage 162 2 2 1 たいあたり 10 162 5 1 2 いあいぎり 30 161 1 1 4 そらをとぶ 40 161 2 1 5 ふぶき 80 160 4 2 8 うたう 0 160 8 1 21 UT Startup Gym
  • 22. 第3正規形 第2正規形から推移関数従属性を取り除くこと" ex. 「battle_id = 162 」→「player_id = 3」→「飯塚修平」 battle player battle_id battle_at player_id battle_type player_id player_name 162 2013/2/22 10:00 3 normal 3 飯塚修平 161 2013/2/22 8:00 5 boss 5 川上和也 160 2013/2/21 23:00 5 normal battle_attack attack battle_id attack_id num attack_id attack_name attack_damage 162 2 2 1 たいあたり 10 未バトルのプレイヤーを   162 5 1 2 マスタに追加しておくことができる いあいぎり 30 161 1 1 4 そらをとぶ 40 161 2 1 5 ふぶき 80 160 4 2 8 うたう 0 160 8 1 22 UT Startup Gym
  • 23. 実際に使うときは •  LEFT JOIN でくっつけていく" •  もっとも使われている技名ランキング" –  SELECT ba.attack_id, SUM(ba.num) FROM battle_attack ba GROUP BY ba.attack_id;" –  やっぱり技名も欲しい・・・→ LEFT JOIN attack" –  SELECT a.attack_name, SUM(ba.num) FROM battle_attack ba LEFT JOIN attack a ON ba.attack_id = a.attack_id GROUP BY ba.attack_id;" 2013/02/23 23 UT Startup Gym
  • 24. さきほどの例なら •  Google の従業員一覧" •  まず Google が ID = なんちゃらだとして" –  SELECT user_id 
 FROM user_employment 
 WHERE company_id = なんちゃら;" •  社名で指定したいので LEFT JOIN company" –  SELECT user_id 
 FROM user_employment ue 
 LEFT JOIN company c ON ue.company_id = c.id 
 WHERE c.name = 'Google';" •  さらに従業員の名前を出したいので LEFT JOIN user" –  SELECT u.id, u.name 
 FROM user_employment ue 
 LEFT JOIN company c ON ue.company_id = c.id 
 LEFT JOIN user u ON ue.user_id = u.id 
 WHERE c.name = 'Google';" 2013/02/23 24 UT Startup Gym
  • 25. 実際の設計の手順 •  正規化は、冗長なところがないかをチェックするための もの。 •  設計時はエンティティを考えて、それらの関係を考えて いく。 –  エンティティ→マスターテーブル –  関係→トランザクションテーブル •  たとえば掲示板サイトなら –  マスタ •  スレッドマスタ •  コメントマスタ •  ユーザマスタ(匿名性なら不要) –  トランザクション •  投稿テーブル(誰が、どのスレッドに、なんというコメントをしたか) 2013/02/23 25 UT Startup Gym
  • 26. 2013/02/23 26 UT Startup Gym
  • 27. チューニング •  高速にデータを取得するためにインデックスを張る、SQL を書き換 えるなどの工夫をする。 •  EXPLAIN コマンド –  詳細は http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html •  サブクエリは使わない –  詳細は http://nippondanji.blogspot.jp/2009/03/mysql_25.html 2013/02/23 27 UT Startup Gym
  • 28. 参考文献 •  データベースを使おう @UT Startup Gym by @amachang
 http://www.slideshare.net/tushuhei/ss-16506218 •  第3回 素早く正規形を見抜く実践テクニック – @IT
 http://www.atmarkit.co.jp/fdb/rensai/db_enginer03/db_enginer03_1.html •  MySQLのEXPLAINを徹底解説!! – 漢のコンピュータ道
 http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html •  なぜMySQLのサブクエリは遅いのか。 – 漢のコンピュータ道
 http://nippondanji.blogspot.jp/2009/03/mysql_25.html 2013/02/23 28 UT Startup Gym