兎小屋の手記

読書記録とか。

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設計したときにどちらが正解か悩んで複数のサブテーブルを切った(具象テーブル継承を採用した)ことがあったが、 シングルテーブル継承はサブタイプの種類やサブタイプ固有の属性が少ない場合に向いているそうだ。

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

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

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

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

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

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

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

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