SlideShare uma empresa Scribd logo
1 de 15
深い親子関係を
整合性も崩さず非正規化
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マッパーには、あくまでこうだと思わせておけばいいのです。

Mais conteúdo relacionado

Mais procurados

イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
 

Mais procurados (20)

MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 

Destaque

Destaque (6)

外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
 
リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計
 
メッチャ役に立つauto_incrementの話
メッチャ役に立つauto_incrementの話メッチャ役に立つauto_incrementの話
メッチャ役に立つauto_incrementの話
 
Gladiator, GUI management tool of ROMA (NOSQL based ruby).
Gladiator, GUI management tool of ROMA (NOSQL based ruby).Gladiator, GUI management tool of ROMA (NOSQL based ruby).
Gladiator, GUI management tool of ROMA (NOSQL based ruby).
 
SolrとElasticsearchの比較
SolrとElasticsearchの比較SolrとElasticsearchの比較
SolrとElasticsearchの比較
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 

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