Text
Page: 1
STI を避けたい
I wish I evacuate STI
yancya
RubyHiroba 2014
2014/09/21
Powered by Rabbit 2.1.3 and COZMIXNG
Page: 3
STI って使ってます?
どうですか?
Page: 4
STI とは
Single Table Inheritance
単⼀テーブル継承
モデルクラスを継承で表現
し、永続化部分はスーパーク
ラスのテーブル1枚でまかな
う
Page: 8
STI の便利さ
サブクラス特有のカラムを
add̲column して、スーパー
クラスを継承するだけで作れ
ちゃう便利
スーパークラスに共通処理や
属性を持たせることで、サブ
クラスのコードがスッキリ!
Page: 9
STI すごい
メタデータカラムがあるの
で、親クラスのインスタンス
から、⼦クラスを特定出来た
りする
Page: 11
外部キー制約
ついに Rails 本体に外部キー
制約サポートがくるよー
Support
for
foreign keys!
real
[「http://weblog.rubyonrails.org/2014/8/20/
Rails-4-2-beta1/」より引用]
Page: 12
外部キー制約って使います?
みなさん、どうですか?
Page: 13
STI と外部キー制約
外部キー制約を使うとして
⼦クラス特有の属性を定義
その属性が外部キー
その属性に NOT NULL 制約
を付けたいとする
Page: 14
STI で外部キー制約
親や他の⼦クラスから
INSERT したら NULL が⼊
っちゃう(⼊らなくてエラ
ー)
いいこと思いついた!外部テ
ーブル側に {id: 99999,
value: "無し"} みたいなレコ
ードを⼊れておいて、外部キ
ーに NULL が⼊りそうにな
ったら、代わりに 99999 を
Page: 15
例えば、STI を避ける
STI を避ける必要は全然無い
呪われし RDB 厨の業
Nullable column
正規化
では、しかるべきデータ格納
⽅法とは
Page: 16
STI の背景
Relational
databases
don't
support
inheritance, so when
mapping...
[「http://www.martinfowler.com/eaaCatalog/
singleTableInheritance.html」より引用]
Page: 17
RDBMS
みなさん、何使ってます?
Page: 18
PostgreSQL
RDBMS 界の優等⽣
バージョン毎の⽇本語ドキュ
メントが充実
Heroku のデフォルト
RDBMS
v9.2 から JSON 型をサポー
ト(v9.3 で更に⾼機能に)
Page: 19
Table Inherited
"Relational databases
don't support inheritance,
so when mapping..."
テーブルの継承
PostgreSQL にはあるんです
Page: 21
Where a row come
from?
この列は特に、継承階層か
らの選択問い合わせでは便
利です。tableoidはテーブ
ル名を得る た め に
pg̲classのoid列に結合す
ることができます。
[「システム⾏ - tableoid」より引用]
Page: 22
Behavior of Parental
Model
Page: 23
Behavior of Inherit
Model
継承したままだと
table̲name がスーパークラ
スのもの
Page: 25
テーブル継承の注意点
多重継承ができる
単にデータベースの機能とし
て⾒れば便利
多重継承の無いプログラミン
グ⾔語とマッピングしづらい
Page: 26
テーブル継承の注意点
親テーブルで PRIMARY
KEY, UNIQUE の宣⾔をして
いても、⼦テーブルまでは制
約が伝播しません
親テーブルに外部キーを持っ
て、外部キー制約をつけてい
ても、⼦テーブルまで制約が
伝播しません
Page: 27
テーブル継承の注意点
NOT NULL
DEFAULT
これらは⼦テーブルに伝播し
ます
Page: 28
何が起こりうるか
PRIMARY KEY, UNIQUE に
ついて、親まで遡らないの
で、⼦テーブルから重複値を
⼊れ放題
⼦テーブルに別途制約を付け
ても、⼦テーブル内でしかチ
ェックしないので根本解決に
ならない
Page: 29
具体的に困ること
ただ、DEFAULT は伝播するの
で、ID シーケンスは親テーブルと
共通なので、ID を直接指定して
INSERT UPDATE しなければ問題
ない。しなければ
Page: 31
テーブル継承のこれから
PostgreSQL 9.3.2⽂書
5.8.1 によれば
「これらの機能の不⾜は、今
後のリリースでおそらく改善
されるでしょう」とのこと
ただ、まぁ Version 7.4 から
ずっと書いてあるので
Page: 32
まとめ
おとなしく STI を使いましょ
う
でも、必要がなくなったら使
うのをやめたい
Page: 33
質疑応答
もし質問がなければ、こちら
から皆さんに質問したり
まめ知識を披露しますね
Powered by Rabbit 2.1.3 and COZMIXNG