Text
Page: 1
STI を避けたい I wish I evacuate STI yancya RubyHiroba 2014 2014/09/21 Powered by Rabbit 2.1.3 and COZMIXNG
Page: 2
自⼰紹介 @yancya
Page: 3
STI って使ってます? どうですか?
Page: 4
STI とは Single Table Inheritance 単⼀テーブル継承 モデルクラスを継承で表現 し、永続化部分はスーパーク ラスのテーブル1枚でまかな う
Page: 5
STI の実装例(親クラス)
Page: 6
STI の実装例(親クラス)
Page: 7
STI の実装例(⼦クラス)
Page: 8
STI の便利さ サブクラス特有のカラムを add̲column して、スーパー クラスを継承するだけで作れ ちゃう便利 スーパークラスに共通処理や 属性を持たせることで、サブ クラスのコードがスッキリ!
Page: 9
STI すごい
メタデータカラムがあるの
で、親クラスのインスタンス
から、⼦クラスを特定出来た
りする
Page: 10
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: 20
継承先テーブルの作成
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: 24
Model Classes
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: 30
回避策
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