Strings of Life

PHP/Phalcon/MySQL/JavaScript/RegExp/Ruby/Perl/ActionScript

2013年07月

7月は、SQLやRDBの設計等について学習しました。

読んだのは、『Head First SQL』。

RDBのテーブルの正規化についてきちんと学べたのは良かったです。


ただ、月の後半から新しいタスクが発生し、そちらでMongoDBが必要になったため、月の後半はMongoDBの学習が中心でした。

MongoDBは、NoSQLデータベースの一つで、ドキュメント指向データベースと呼ばれます。スキーマレス、すなわち、事前に入力するデータの形式を指定しない点に特徴があります。

実際使ってみると、RDBにはない手軽さがある反面、綴りの違いがそのまま別データとして格納されるといった怖い側面もあります(例えば、languageとlang)。

RDBと比較した際、明らかな欠点は、ライブラリが未成熟な点。私が現在担当しているプロダクトではActiveMongoライブラリを使っていますが、ドキュメントがほとんど無い上に、実装のおかしな箇所もあったりするので、生のMongoDBドライバを使わざるをえない場面があります。また、フレームワークのページャーが利用できなくて、自分でページャーを書いたり。。。

-----

8月は、『詳説 正規表現 第3版』を読もうと思います(現在読んでるところ)。

詳説 正規表現 第3版
詳説 正規表現 第3版 [大型本]

堅いタイトル・オライリーブランド・分厚さ と、読者を怖気づかせる要素に事欠きませんが、実際読んでみると非常に読みやすい。全くの初心者にも伝わるように、正規表現の考え方から説き起こしています。

『詳説 正規表現』の後は未定。jQueryでもやろうかなと思います。

Head First SQL ―頭とからだで覚えるSQLの基本
Head First SQL ―頭とからだで覚えるSQLの基本 [大型本]


本書は、データベース言語SQLの入門書。一般のSQL入門書に比べると、かなり欲張りな内容。1冊で、SQLの基本からテーブル設計の初歩、データベースの管理まで学べる。よくあるSQL入門書は、CRUDとJOIN、サブクエリあたりでおしまい。

4000円台と、技術系の入門書としては高価な部類に入るが、テーブル設計入門のためにもう1冊買う必要がないことを考えると、決して割高ではない。本気でデータベース技術を身につけたい人にはオススメできる。


個人的には、今回はテーブル設計のところを重点的に読んだ(主に第7章)。正規化の概念がそれなりに分かるようになったのが最大の収穫。

JOINやサブクエリも、ある程度掘り下げて書いてあるので、ちゃんと理解したくなったら再読しようと思う(最近、フレームワークのORMに頼りっきりでSQL書いてない…)。

10/09 追記:この記事で壊れたと報告しているMacBook Air mid 2012のSSDは、東芝製でした。

参考:ここ数ヶ月でMacBook Air Mid 2012の東芝製SSDが壊れる不具合が頻発している」というのは本当なのか調べてみた。 (Appleちゃんねる)

-----

表題の通りですが、昨年の6月に買ったMacBook Airが、昨日お亡くなりになりました。ハードウェアに異常な素振りは無かったのですが、突然強制終了→起動しようとすると「?」マークが表示され、セーフブート等も行えない、という状態になりました。

Genius Barを急遽予約して持ち込んだところ、SSDが死んでるとのことで、購入から1年1ヶ月経ってるので保証期間外。スペックに不満はあったし、修理だと1週間は戻ってこないので、仕事に支障が出る。ということで、新しく買うことにしました。

購入したのは、MacBook Air 13インチ・USキーボード・Core i7・メモリ8GB・SSD 512GBモデルです。いわゆる「一番いいのを頼む」ってやつですね。本当はメモリ8GB+SSD 256GBあれば十分で、Core i7やSSD 512GBは要らなかったのですが、店頭在庫有るのが、メモリ4GBのモデルとフルカスタマイズモデルだけだったので、やむなく全部盛りに。あと、Apple Careもつけときました。1年に1回故障すると考えると、3年保障つけといても損はないかな、と。このスペックなら3年使えるはず…。


買って帰ってTime Capsuleから旧マシンのデータを復元しようとしたら、Time Capsuleを認識しないというトラブルも発生。これはThunderbolt to Gigabit Ethernetアダプタの故障で、不具合に気づかなかったため最近1週間ほどのデータはバックアップできていませんでした。まあ、環境を一からセットアップするのに比べれば、遥かにマシですが…。

Time Capsuleからの復旧は1時間弱で終了して、環境もほぼ元通り。

教訓:バックアップ超重要

PCを商売道具として使っている人は、
・毎日必ずバックアップを作成すべき(職場にバックアップHDD設置すべき)
・可能であれば、バックアップは多重に作成すべき
・メインマシンが壊れた時用のサブ機も用意しておくといいかも(すぐに新しいマシンを買えるだけのお金があれば必要ないかも)

Macは、Time Machineを使えば1時間程度でマシンの状態をほぼ完全に修復できるので、仕事道具としてはとても頼りになると思いました。

リレーショナルデータベース(RDB)の世界には、「正規化」という、テーブル設計のベストプラクティスがあります。ということで正規化についてメモ。



正規化されたターブルの状態(正規形)には、いくつかの段階がある。まず、第1正規形(First Normal Form, 1NF)では、テーブルが持つ列と値の性質に注目する。

第1正規形:
規則1:列は原子的な値のみを含む
規則2:テーブルは原子的な列のみを含む

「原子的な」とは、「必要な最小限の単位になっている」という意味。各規則の例は以下。
例1:「成分:レタス、トマト、キュウリ」→「レタス」「トマト」「キュウリ」に分解できる
例2:「成分1:レタス」、「成分2:トマト」、「成分3:キュウリ」→「成分」にまとめられる


次に、第2正規形と第3正規形。ここでは、各列の関係に注目する。

第2正規形:
規則1:第1正規形の条件を満たしている
規則2:部分的関数従属性を持たない

第3正規形:
規則1:第2正規形の条件を満たしている
規則2:推移的関数従属性を持たない

列Aの値が変更されると列Bのデータも変更されないければならないとき、列Bは列Aに関数従属している、という。数式だと、B = f(A)というイメージ。また、T.B ->; T.Aという省略記法もある。

部分的関数従属性とは、主キーではない列が、複合主キーを構成する列の一部に従属しているが、複合主キーを構成する列全体には従属していないこと。

推移的関数従属性とは、キーではない列のどれかが、他のキーでない列のどれかと関連を持つこと。

使う機会はあまり無い気もするけど、何かの時に使えると便利かもしれないMySQLの文字列関数をざっくり紹介。


1. CONCAT - 文字列を連結

SELECT CONCAT('Ma', 'ria', 'DB'); -- 'MariaDB'

引数はいくつでもOK。ちなみに、「--」はSQLのコメント記法。


2. SUBSTRING - 文字列を指定した位置で切り出し

上は標準SQL。下はMySQL独自。

・前から6番目以降の文字列を取得
SELECT SUBSTRING('Knowledgebase' FROM 5); -- 'edgebase'
SELECT SUBSTRING('Knowledgebase',5); -- 'edgebase'

・前から3番目以降、7文字を取得
SELECT SUBSTRING('Knowledgebase',FROM 3, FOR 7); -- 'wledgeb'
SELECT SUBSTRING('Knowledgebase',3,7); -- 'wledgeb'


3. SUBSTRING_INDEX - 文字列を分割

第一引数の文字列を、第二引数のデリミタで分割し、第三引数の値より前の文字列を返す。第三引数を負の数にすると後ろからになる。

SELECT SUBSTRING_INDEX('kb.askmonty.org', '.', 1); -- 'kb'
SELECT SUBSTRING_INDEX('kb.askmonty.org', '.', 2); -- 'kb.askmonty'
SELECT SUBSTRING_INDEX('kb.askmonty.org', '.', 3); -- 'kb.askmonty.org'
SELECT SUBSTRING_INDEX('kb.askmonty.org', '.', -1); -- 'org'
SELECT SUBSTRING_INDEX('kb.askmonty.org', '.', -2); -- 'askmonty.org'
SELECT SUBSTRING_INDEX('kb.askmonty.org', '.', -3); -- 'kb.askmonty.org'


4. RIGHT/LEFT - 右/左から指定文字列を返す

SELECT RIGHT('MariaDB', 2); -- 'DB'
SELECT LEFT('MariaDB', 2); -- 'Ma'


5. UPPER/LOWER - 文字列を全部大文字/小文字に変換

SELECT UPPER('MariaDB'); -- 'MARIADB'
SELECT LOWER('MariaDB'); -- 'mariadb'


6. TRIM - 与えた文字列の前後から空白を除去

SELECT TRIM('     hoge     '); -- 'hoge'


7. LENGTH/CHAR_LENGTH - 与えた文字列のバイト数/文字数を返す

SELECT LENGTH('MariaDB'); -- 7
SELECT LENGTH('マリア'); -- 9
SELECT CHAR_LENGTH('MariaDB'); -- 7
SELECT CHAR_LENGTH('マリア'); -- 3


8. CAST - 文字列を指定した型に変換

SELECT CAST('2013-07-02 00:00:00' AS DATE);


9. LOCATE - 検索文字列の出現位置を取得

SELECT LOCATE('bar', 'foobarbar'); -- 4


10. REPLACE - 文字列置換

SELECT REPLACE('www.mariadb.org', 'w', 'Ww'); -- 'WwWwWw.mariadb.org'


MySQLで使える文字列関数の完全なリストは公式ドキュメントを参照。

また、MySQL互換DBであるMariaDBのドキュメントも構成が分かりやすくてオススメ(ただし、現在は英語版のみ)。

このページのトップヘ