SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
SSTTIIを避けたいIwishIevacuateSTI 
yancya 
RubyHiroba
2014 
2014/09/21 
PoweredbyRabbit2.1.3andCOZMIXNG
自⼰紹介 
@yancya 
何者でも無い1⼈のRubyist
STIって使ってます? 
どうですか?
STIとは 
SingleTableInheritance 
単⼀テーブル継承 
モデルクラスを継承で表現 
し、永続化部分はスーパーク 
ラスのテーブル1枚でまかな 
う
STIの実装例(親クラス)
STIの実装例(親クラス)
STIの実装例(⼦クラス)
STIの便利さ 
サブクラス特有のカラムを 
add̲columnして、スーパー 
クラスを継承するだけで作れ 
ちゃう便利 
スーパークラスに共通処理や 
属性を持たせることで、サブ 
クラスのコードがスッキリ!
STIすごい 
メタデータカラムがあるの 
で、親クラスのインスタンス 
から、⼦クラスを特定出来た 
りする
!
!#
$
STIの注意点
!#$ 
%'()*+,-,./0,,*123,4( 
 
 ! 
 
#
外部キー制約 
ついにRails本体に外部キー 
制約サポートがくるよー 
Support for real 
foreignkeys!
[「http://weblog.rubyonrails.org/2014/8/20/ 
Rails-4-2-beta1/」より引用]
外部キー制約って使います? 
みなさん、どうですか?
STIと外部キー制約 
外部キー制約を使うとして 
⼦クラス特有の属性を定義 
その属性が外部キー 
その属性にNOTNULL制約 
を付けたいとする
STIで外部キー制約 
親や他の⼦クラスから 
INSERTしたらNULLが⼊ 
っちゃう(⼊らなくてエラ 
ー) 
いいこと思いついた!外部テ 
ーブル側に{id:99999, 
value:無し}みたいなレコ 
ードを⼊れておいて、外部キ 
ーにNULLが⼊りそうにな 
ったら、代わりに99999を
例えば、STIを避ける 
STIを避ける必要は全然無い 
呪われしRDB厨の業 
Nullablecolumn 
正規化 
では、しかるべきデータ格納 
⽅法とは
STIの背景 
Relational databases 
don't support 
inheritance, so when 
mapping... 
[「http://www.martinfowler.com/eaaCatalog/ 
singleTableInheritance.html」より引用]
RDBMS 
みなさん、何使ってます?
PostgreSQL 
RDBMS界の優等⽣ 
バージョン毎の⽇本語ドキュ 
メントが充実 
Herokuのデフォルト 
RDBMS 
v9.2からJSON型をサポー 
ト(v9.3で更に⾼機能に)
TableInherited 
Relationaldatabases 
don'tsupportinheritance, 
sowhenmapping... 
テーブルの継承 
PostgreSQLにはあるんです
継承先テーブルの作成
!
#
!!
$ 
%'%
(
!# 	
!
)
 !
$%'%

Contenu connexe

Plus de yancya

SQLQL は GraphQL にとってなんなのか
SQLQL は GraphQL にとってなんなのかSQLQL は GraphQL にとってなんなのか
SQLQL は GraphQL にとってなんなのかyancya
 
どう書く日記
どう書く日記どう書く日記
どう書く日記yancya
 
BigQuery の relation 生成
BigQuery の relation 生成BigQuery の relation 生成
BigQuery の relation 生成yancya
 
use_legacy_sql=false
use_legacy_sql=falseuse_legacy_sql=false
use_legacy_sql=falseyancya
 
Relation の館
Relation の館Relation の館
Relation の館yancya
 
なんか
なんかなんか
なんかyancya
 
SQL 脳から見た Ruby
SQL 脳から見た RubySQL 脳から見た Ruby
SQL 脳から見た Rubyyancya
 
A investigative report of refinements
A investigative report of refinementsA investigative report of refinements
A investigative report of refinementsyancya
 
RubyWorld Conference 2012 へ何で行ったのか
RubyWorld Conference 2012 へ何で行ったのかRubyWorld Conference 2012 へ何で行ったのか
RubyWorld Conference 2012 へ何で行ったのかyancya
 

Plus de yancya (9)

SQLQL は GraphQL にとってなんなのか
SQLQL は GraphQL にとってなんなのかSQLQL は GraphQL にとってなんなのか
SQLQL は GraphQL にとってなんなのか
 
どう書く日記
どう書く日記どう書く日記
どう書く日記
 
BigQuery の relation 生成
BigQuery の relation 生成BigQuery の relation 生成
BigQuery の relation 生成
 
use_legacy_sql=false
use_legacy_sql=falseuse_legacy_sql=false
use_legacy_sql=false
 
Relation の館
Relation の館Relation の館
Relation の館
 
なんか
なんかなんか
なんか
 
SQL 脳から見た Ruby
SQL 脳から見た RubySQL 脳から見た Ruby
SQL 脳から見た Ruby
 
A investigative report of refinements
A investigative report of refinementsA investigative report of refinements
A investigative report of refinements
 
RubyWorld Conference 2012 へ何で行ったのか
RubyWorld Conference 2012 へ何で行ったのかRubyWorld Conference 2012 へ何で行ったのか
RubyWorld Conference 2012 へ何で行ったのか
 

evacuate_from_sti