深い親子関係を
整合性も崩さず非正規化
2015-02-13 外部キーNight
@yuba
http://cs.hatenablog.jp/
自己紹介
@yuba
 株式会社インターコム
 型と制約大好き人間
 ブログとかQiitaで書いてる記事がこんな感じです。
 論理削除と一意性制約を両立させる方法・DB製品別 – Qiita
 トランザクションをネストしたらどうなる? 内側だけロールバックできる? - Qiita
 データベース操作でデッドロックは不可避 – C Sharpens you up
 外部キー参照しあうテーブルを遅延制約で実現する – C Sharpens you up
 SQL Serverの計算列を使ってツリー構造データを完全に制約付ける – C Sharpens you up
 SQLのカラム制約はテーブル制約と等価 – C Sharpens you up
テーブルの深い親子関係
正規なままではSELECT大変ですよね
 あるユーザーに最近付いたコメントを取得したい
正規なままではSELECT大変ですよね
 あるユーザーに最近付いたコメントを取得したい
_人人人人人人人人人人人人人人人人人人人人人人人人人人_
> SELECT .... FROM コメント <
> LEFT JOIN 記事 ON コメント.id_記事=記事.id <
> LEFT JOIN ブログ ON 記事.id_ブログ=ブログ.id <
> WHERE ブログ.id_ユーザー=... AND コメント.date > .. <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
正規なままではSELECT大変ですよね
JOIN HELL
_人人人人人人人人人人人人人人人人人人人人人人人人人人_
> SELECT .... FROM コメント <
> LEFT JOIN 記事 ON コメント.id_記事=記事.id <
> LEFT JOIN ブログ ON 記事.id_ブログ=ブログ.id <
> WHERE ブログ.id_ユーザー=... AND コメント.date > .. <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
非正規化しますよね
非正規化しますよね
でもこの id_ユーザーが正しいこと、
保証したいですよね。
参照整合性も保ったまま
非正規化してみよう
複合キーだ!
参照整合性も保ったまま
非正規化してみよう
外部キー込みの複合キーは
O/Rマッパー泣かせ。
特にINSERTが書けない。
やはり、単一キーのまま
非正規化するしかない?
2つのプロジェクトで後悔した末に
編み出した解決方法
解決:単一主キーは保ったまま…
解決:単一主キーは保ったまま
主キー以外のカラムを絡めた
UNIQUEキーに外部キーを張ろう
ご清聴ありがとうございました
 O/Rマッパーには、あくまでこうだと思わせておけばいいのです。

深い親子関係のテーブル設計