Rabbit Slide Show

evacuate_from_sti

2014-09-21

Description

RubyHiroba 2014 の生活発表会で発表したスライドです STI についてと、それを避けたらどういう実装がありうるかという話です

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

Other slides