兎小屋の手記

PerlやPHPの話題などをひっそりと書きます。

SQLアンチパターン読書記録2

通勤時間でまた読み進めたのでメモメモ。

6章:ポリモーフィック関連 Bugs、FeatureRequestsという2つのテーブルに対してそれぞれのコメントをCommentsに格納する場合、 Commentsの親テーブルが2つになってしまい、外部キー制約が定義できないパターン。

解決策は2つ 1.多:多を関連づける交差テーブルを作成して、Bugs-交差テーブル1-Comments-交差テーブル2-FeatureRequestsとする。 2.5章のEAVと同様に、共通のIssuesテーブルを作成して、Bugs、FeatureRequests、Commentsという3つの子テーブルをぶら下げる。

7章:マルチカラムアトリビュート(複数列属性) 1章のジェイウォークと同様に単に正規化できていないパターン 1章は1カラムにカンマ区切り、こちらはカラム1,カラム2・・・としてしまうパターン。 こちらの場合は特にカラム数以上にデータを格納する場合に破綻する。

8章:メタデータトリブル(メタデータ大増殖) スタートレックに出てくる小さいが、繁殖力のあるトリブルという動物が元ネタ。 検索してみたら原作のトリブルは、顔や手足がない毛玉のような動物でした。

増加し続けるデータを何らかのルールによって複数のテーブルに分割するパターン。 一意性が保証できなくなったり、テーブルを跨いだクエリ実行が困難になる。 水平パーティショニングやシャーディングという機能を使うことが解決策らしい。 使ったことがないのでピンとこないが、今度試してみよう。

ここまででデータベース論理設計のアンチパターンは終了。

SQLアンチパターン読書記録1

唐突にSQLアンチパターンを読み始めたので読書記録を。 2年くらい前に買って斜め読みしたまま書棚に眠っていたので引っ張り出して少しずつ読んでいます。

少しずつ読んでいるので各章のメモ書き。

1章:ジェイウォーク(信号無視)

1カラムに複数の値をカンマなどで結合してINSERTしてしまうパターン。 単に正規化できていないパターン

2章:ナイーブツリー(素朴な木)

階層構造を表現するパターン。 解決策に示されている方法は経路列挙、入れ子集合、閉包テーブル。 木構造や階層構造をDBでどう扱うかというテーマで本が出ているくらいなので実際に手を動かして試してみたい。(今回はやってない。)

3章:IDリクワイアド(とりあえずID)

ナチュラルキーがあってもなくてもとりあえずサロゲートキーにしてしまうパターン。 アンチパターンを用いてもよい場合としてORMフレームワークを使っている場合が挙げられていますが、 あくまでツールの都合なので、実質的な自然キーがありながらもIDを作るなら、せめてUNIQUE制約をつけないと悲劇が起きるかも。 本来、一意なhogehogeデータがなぜか2レコードできちゃった!みたいな。

4章:キーレスエントリ(外部キー嫌い)

タイトル通り、外部キー制約を使用しない。 poka-yoke(ポカヨケ)という言葉が紹介されていますが、まさにこれに尽きる。

5章:EAV(エンティティ・アトリビュート・バリュー)

キー:バリューで保持できるように可変のテキスト型で表現してしまうパターン 解決策はサブタイプを定義し、そのタイプによって参照・非参照のカラムを分け、非参照のカラムにはNULLを入れる、シングルテーブル参照と 共通するカラム以外はサブテーブルを作る具象テーブル継承 以前、DB設計したときにどちらが正解か悩んで複数のサブテーブルを切った(具象テーブル継承を採用した)ことがあったが、 シングルテーブル継承はサブタイプの種類やサブタイプ固有の属性が少ない場合に向いているそうだ。

また進んだら更新しようと思います。

片付けの魔法本を読んで大掃除

こんにちは、また間が空きました。

少し前に、海外でこんまりの片付け本が人気になっていると聞いたので、遅まきながら私も読んでみました。昼休憩や電車のなかでちょこちょこ読んでいて、「やってみるか!」となったので早速実践。

我が兎小屋で圧倒的に多いものは書籍。実家にもまだ半分以上残っているのですが、この兎小屋には専門書、ビジネス書、文庫、漫画などなど300冊以上の本がありました。

この本の中ではモノ別の片付け約20個のうち3個が書籍に関するものです。自分流にざっくりまとめると、「積み本は捨てる。」、「全部床に並べて中身を見ないで要不要を判断する。」、「殿堂入りの本は残す。」というところでしょうか。

積み本として資格・語学の書籍や昔業務で必要で買ったけどあまり読まなかったなぁという書籍、ビジネス書を50冊ほど処分。 SFやラノベ、漫画はほとんど処分。 個人的な殿堂入り本、野尻抱介さんの「ふわふわの泉」は文句なく残しました。

いざやってみると、自分のお気に入りの書棚1本に入るくらいが適量なのかなぁと思いました。私の書棚はイケアのCDラックなのですが、精一杯つめて大体80冊くらいでしょうか。要はすぐに取り出せて読めるようにしてある本はとっておけばよいのです。逆に押入れやダンボールにつめてある本は処分候補になるでしょう。

服に関してはアトピーもちなので、肌さわりの悪いものは即処分するため、仕事着、普段着ともに最低限しかなく、ささーっとゴミ袋2個分くらい捨てて終わり。

部屋の片隅に積んでいた本が消えて大分さっぱりしました。

片付け本にも書いてありましたが、捨てられないものは「過去への執着」と「未来への不安」に集約されるそうです。多少は過去の執着を捨てられたのだろうか・・・

しかし、このブログテーマが一貫しませんね!まぁいいか・・・

近況(転職活動などなど)

前回の更新から1ヶ月経ちました。

その間に日帰り旅行したり、内定が出て地味に続けていた転職活動が終了したりとそれなりに忙しかったような気がします。

転職活動は単に応募する求人サイトやコードを書いて応募する転職サイトなんかも試しましたが、最終的には知人の紹介で転職エージェントを利用して内定に至りました。 現在の会社も近いうちに退職するので今度は後任の採用面接を担当していたり、なんだか妙な気分です。

私が面接に行った企業では質疑応答はありましたが、技術的なテストやそれに近い試問のようなものはほとんどなく、過去に開発したシステムの簡単な仕組みや開発環境に関する質問ばかりでした。 自分で採用面接をするときには簡単なテスト(本当に簡単でFizzBuzzSQLの結合の筆記試験)をするようにしているので、逆に不安になることも多かったです。 志望度がとても高いところ、ではなかったのですが、割と未経験の分野でいわゆる受託開発を離れて自社の事業に関する開発業務になりそうです。

PHPで開発するそうなので、改めて勉強しないといけないようなこともあまりなく手持ち無沙汰になったので、大昔に学生のときにかじったSchemeをもう一度やってみようと思い立ち、押入れからScheme手習いやらプログラミングGaucheを引っ張り出して電車などで読んでいました。

結局のところ、読むだけであまりコードを書いて試すこともなくて身につかないので色々調べて「実践Common Lisp」を読むことしました。SchemeからCommon Lispに移ってるけど、まぁ・・・気にしない。 GWも近くて気合入れて買ってきましたがいつもどおりの三日坊主なので読みきれるかな? ※前回の英語も何個かKindleで買った本を読んだくらいで止まってしまったので・・・

多聴多読マガジンを買った

表題の通り、多聴多読マガジンを買ってきました。 最近、CakePHPのCookBookを読むことが増えているのですが、英語力がほとんどないため、簡単なテストをしてみたいなと思っていました。週末実家に帰って時間を持て余していたのでぶらぶらと本屋に入ってみたら多聴多読マガジン4月号の表紙に多読のチカラリーディング力判定テストという文字が目に入り即購入しました。

判定テスト自体は10分もかからない簡単な読解問題でしたが、私は半分ちょっとくらいとだいぶ良くない点数でした。 なので一番低いランクの読み物からスタートすることにしました。

雑誌はあまり単独で買っても意味がないと思っていましたが、レベルに合った書籍の紹介などはかなりためになりました。 これ以上本が増えるとただでさえ狭い兎小屋が埋め尽くされてしまうので、電子書籍中心にすすめることにします。(三日坊主なのでいつまでつづくやら)

今日の通勤時間で読んだのは雑誌に載っていたBig Fishでした。 ほとんど挿し絵の絵本のような本なので、数分で読み終えました。 明日は何を読もう。

Mojoliciousに挑戦(とりあえず設置)

ここ1年ちょっとくらいCakePHPを仕事で使っていてsave便利だなーとかValidateのallowEmptyが使いづらいなーなんていろいろ思うようになりました。比較する別のFrameworkがないのでPerlのMojoliciousを使ってみようとインストールしてみました。 CGIで実行するのは主流じゃないようですが、Plackを全然知らないのでとりあえずCGIで設置してみました。

以下を参考にVirtualHostの設定を書いて実行! ずーっと@INCのエラーがでてて、SetEnvしてあげても直らなくて首をひねっていたらディレクトリ名間違えていたという・・・ Mojolicious::Guides::Cookbook - Cookbook

また忘れるかもしれないのでメモメモ。

    ScriptAlias / /srv/www/インストールしたディレクトリ/script/test_web/
    SetEnv PERL5LIB /home/ユーザ名/perl5/perlbrew/perls/perl-5.20.2/lib/5.20.2/:/home/ユーザ名/perl5/perlbrew/perls/perl-5.20.2/lib/site_perl/5.20.2/

    <Directory /srv/www/インストールしたディレクトリ>
        AllowOverride All
        SetHandler cgi-script
        Require all granted
    </Directory>

*1

*1:いろいろなところに書いてあったけども、Apache2.4系ではディレクティブの設定ファイルの書き方が少し変わっているみたい

Macbook Air(openSUSE)設定中

いつまで設定してんだ!って感じですが、ゆっくりまったりと。

今日は11.6inchだと若干小さいと思い、外部ディスプレイに出力してみました。 といってもHDMIのポートもないので、以前買っていたThunderbolt−HDMIの変換コネクタをとりあえず挿してみた。 すると、何の設定もすることなく、勝手に認識してくれましたのであっけなく終了

なんとなくPerlをもう一回やってみようと思ったので、押し入れからラクダ本やらアルパカ本を引っ張りだしてちまちま読み返しています。 半端に知っている分なかなか進まないのですが、なにかウェブフレームワークを決めて何か作ってみようかなぁと模索中。