狠狠撸

狠狠撸Share a Scribd company logo
SQLアンチパターンその2

素

朴

な

木

ナイーブツリー
ナイーブツリー
is
直近の親のみを参照する事でツリー構造を表現する
SQLアンチパターン
シナリオ
A「ブログのコメント欄さ」
? B「はい」
? A「よく議論やってるじゃん?」
? B「ですね」
? A「スレッド形式で表示できたら分かりやす
いと思うんよね」
? B「考えてみます」
?
シナリオ
?

id

B「今のテーブル定義こんな感じだから」
comment

1

たけのこ派駆逐したい

2

きのこ派怖いわー

3

>>1 同意

4

>>2 たけのこ汚い

たけのこ派駆逐したい

きのこ派怖いわー

>>1 同意

>>2 たけのこ汚い
シナリオ
?

id

B「コメント間に親子関係があればいいわけ
で」
comment

1

たけのこ派駆逐したい

2

きのこ派怖いわー

3

>>1 同意

4

>>2 たけのこ汚い

たけのこ派駆逐したい

きのこ派怖いわー

>>1 同意

>>2 たけのこ汚い
シナリオ
?

B「こうすればいいか」

id parent

comment

1

null

たけのこ派駆逐したい

2

1

きのこ派怖いわー

3

1

>>1 同意

4

2

>>2 たけのこ汚い

たけのこ派駆逐したい

きのこ派怖いわー

>>2 たけのこ汚い

>>1 同意
シナリオ
?

B「こうすればいいか」

id parent

comment

1

null

たけのこ派駆逐したい

2

1

きのこ派怖いわー

3

1

>>1 同意

4

2

>>2 たけのこ汚い

たけのこ派駆逐したい

素

朴

な

木

ナイーブツリー

きのこ派怖いわー

>>2 たけのこ汚い

>>1 同意
Bの主張
?

葉の追加も簡単だし参照整合性も維持でき
るし最強に見える。
Bの主張
?

葉の追加も簡単だし参照整合性も維持でき
るし最強に見える。
? ツリーの参照は?

? コメント数の数えるとか集約系の関数は?
? 非叶ノードの削除は?サブツリーの昇格は?
ナイーブツリー選択のデメリット
?

(サブ)ツリーを引っこ抜けない
? ツリー全体
? あるいはあるコメントのサブツリー
ナイーブツリー選択のデメリット
?

(サブ)ツリーを引っこ抜けない
? ツリー全体
? あるいはあるコメントのサブツリー

select
c1.*
from comm c1

たけのこ派駆逐したい
ナイーブツリー選択のデメリット
?

(サブ)ツリーを引っこ抜けない
? ツリー全体
? あるいはあるコメントのサブツリー

select
c1.*, c2.*
from comm c1
left outer join comm c2
on c1.id = c2.parent

たけのこ派駆逐したい

きのこ派怖いわー
コメント1を親に持つコメント
ナイーブツリー選択のデメリット
?

(サブ)ツリーを引っこ抜けない
? ツリー全体
? あるいはあるコメントのサブツリー

select
c1.*, c2.*, c3.*
from comm c1
left outer join comm c2
on c1.id = c2.parent
left outer join comm c3
on c2.id = c3.parent

たけのこ派駆逐したい

きのこ派怖いわー

>>2 たけのこ汚い
コメント1を親に持つコメント
を親に持つコメント
ナイーブツリー選択のデメリット
?

(サブ)ツリーを引っこ抜けない
? ツリー全体
? あるいはあるコメントのサブツリー

?

n階層取得したい場合は…?
? 子が存在し続ける限り自動でjoinし続けてくれ

るSQLは書けない
? 取得できる階層が固定される

? 必然的にある任意の(サブ)ツリーのコメント総

数みたいな集約関数も使えない
ナイーブツリー選択のデメリット
?

非葉ノードとそのサブツリーの削除
? コメント1削除
? コメント1を親に持つコメントを削除

? …とやりたいけど参照整合性のため子から削除

する必要がある
? c1、c1を親に持つ(c2)、c2を親に持つ…を結果
が返らなくなるまで繰り返して削除対象のコメ
ントを取得し、子側からdeleteしないとダメ
? とは言えdelete on cascadeが使えれば、これ
は自動化出来る
ナイーブツリー選択のデメリット
?

非葉ノードとそのサブツリーの削除
たけのこ派駆逐したい

select
ナイーブツリー選択のデメリット
?

非葉ノードとそのサブツリーの削除
たけのこ派駆逐したい

きのこ派怖いわー

select

select
ナイーブツリー選択のデメリット
?

非葉ノードとそのサブツリーの削除
たけのこ派駆逐したい

きのこ派怖いわー

>>2 たけのこ汚い

select

select
select
ナイーブツリー選択のデメリット
?

非葉ノードとそのサブツリーの削除
たけのこ派駆逐したい

きのこ派怖いわー

select

select
delete
ナイーブツリー選択のデメリット
?

非葉ノードとそのサブツリーの削除
たけのこ派駆逐したい

select

delete
ナイーブツリー選択のデメリット
?

非葉ノードとそのサブツリーの削除
delete
ナイーブツリー選択のデメリット
?

非葉ノード削除とそのサブツリーの昇格
? 非葉ノードにくっついていたサブツリーを自分

の親の子へ昇格させる場合
? こちらはdelete on cascadeズパーンとはいか
ない
? 削除前に自分の子を取得し、子の親を自分の親
へ付け替えた上で削除する必要がある
ナイーブツリー選択のデメリット
?

非葉ノード削除とそのサブツリーの昇格
たけのこ派駆逐したい

きのこ派怖いわー

>>2 たけのこ汚い

>>1 同意

←削除したい
ナイーブツリー選択のデメリット
?

非葉ノード削除とそのサブツリーの昇格
たけのこ派駆逐したい

きのこ派怖いわー

>>2 たけのこ汚い

>>1 同意

←削除したい
←子の親を
ナイーブツリー選択のデメリット
?

非葉ノード削除とそのサブツリーの昇格
たけのこ派駆逐したい

きのこ派怖いわー

>>2 たけのこ汚い

>>1 同意

←削除したい
←自分の親へ更新
ナイーブツリー選択のデメリット
?

非葉ノード削除とそのサブツリーの昇格
たけのこ派駆逐したい

←削除
>>2 たけのこ汚い

>>1 同意
ナイーブツリー選択のデメリット
?

非葉ノード削除とそのサブツリーの昇格
たけのこ派駆逐したい

>>2 たけのこ汚い

>>1 同意
ナイーブツリー選択のデメリット
?

まとめ
? 再帰的にクエリ吐けるとかじゃなきゃやってら

れない
? サブツリー一括の削除や移動はまだしもノード
の昇格とかちょっと凝った操作を実現するのは
つらい。
叠「僕は…どうしたらよかったんだ…」
解決策
?

代替ツリーモデルを使いましょう
? ツリーを表現する他の方法
? 経路列挙モデル
? 入れ子集合モデル
? 閉包テーブルモデル
解決策 : 経路列挙モデル
id path

comment

1

1/

たけのこ派駆逐したい

2

1/2

きのこ派怖いわー

3

1/3

>>1 同意

4

1/2/4

>>2 たけのこ汚い
たけのこ駆逐したい

きのこ派怖いわー

>>2 たけのこ汚い

>>1 同意
解決策 : 経路列挙モデル
?

メリット
?

サブツリーの一括取得ができる
? likeを用いたパターンマッチ
? path

like ‘1/2/%’

ノードの追加は親ノードのpathにidを連結した
path文字列で追加する
? 葉ノードの削除はdeleteするだけ
?

?

デメリット
>突然のジェイウォーク!<
? 長さ制限とか参照整合性とか同様の脆弱性
? 非葉ノードの削除、サブツリーの昇格とか移動とか
は子のpathを全て更新しないといけないので隣接
ツリーよりだるい
?
解決策 : 経路列挙モデル
id path

comment

1

1/

たけのこ派駆逐したい

2

1/2

きのこ派怖いわー

3

1/3

>>1 同意

4

1/2/4

2に子を追加

>>2 たけのこ汚い
たけのこ駆逐したい

きのこ派怖いわー

>>2 たけのこ汚い

>>1 同意
解決策 : 経路列挙モデル
id path

comment

1

1/

たけのこ派駆逐したい

2

1/2

きのこ派怖いわー

3

1/3

>>1 同意

4

1/2/4

>>2 たけのこ汚い

5

1/2/5

きのこfudやめろ
たけのこ駆逐したい

きのこ派怖いわー

>>2 たけのこ汚い

>>1 同意

きのこfudやめろ
解決策 : 経路列挙モデル
id path

comment

1

1/

たけのこ派駆逐したい

2

1/2

きのこ派怖いわー

3

1/3

>>1 同意

4

1/2/4

>>2 たけのこ汚い

5

1/2/5

path like ‘1/2%’で
サブツリーを選択できる。

きのこfudやめろ
たけのこ駆逐したい

きのこ派怖いわー

>>2 たけのこ汚い

>>1 同意

きのこfudやめろ
解決策 : 入れ子集合モデル
id

left

right

comment

1

1

8

たけのこ派駆逐したい

2

2

5

きのこ派怖いわー

3

6

7

>>1 同意

4

3

4

>>2 たけのこ汚い
たけのこ駆逐したい
1

8

きのこ派怖いわー
2

5

>>2 たけのこ汚い

3

>>1 同意

4

6

7
解決策 : 経路列挙モデル
?

Left? Right?
?
?
?

?

メリット
?
?

?

Left : その子ノードの持つどのLR値よりも小さい値
Right: その子ノードの持つどのLR値よりも大きな値
深さ優先探索で求まる
子孫、先祖ノードの一括取得ができる
ノードを削除すると自動的に子ノードが親ノードの子へ
昇格する

デメリット
?

ノードの追加や更新(移動)が複雑過ぎる
?

?

LR値の再計算が必要

隣接リストでは簡単な直近の子の取得がだるい
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

きのこ派怖いわー

>>2 たけのこ汚い

>>1 同意
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

きのこ派怖いわー
2

>>2 たけのこ汚い

>>1 同意
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

きのこ派怖いわー
2

>>2 たけのこ汚い
3

>>1 同意
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

きのこ派怖いわー
2

>>2 たけのこ汚い
3

4

>>1 同意
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意

4
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意

4

6
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意

4

6

7
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

8

きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意

4

6

7
解決策 : 入れ子集合モデル
サブツリーの
どのLR値より小さい

たけのこ駆逐したい
1

8

きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意

4

6

7
解決策 : 入れ子集合モデル
サブツリーの
どのLR値より大きい

たけのこ駆逐したい
1

8

きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意

4

6

7
解決策 : 入れ子集合モデル
1の子孫ツリーの取得
→L値が1~8のコメント

たけのこ駆逐したい
1

8

きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意

4

6

7
解決策 : 入れ子集合モデル
1の子孫ツリーの取得
→L値が1~8のコメント

たけのこ駆逐したい
1

8

きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意

4

6

7
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

8

きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意

4

4の先祖ツリーの取得
→L <= 3 <= R を満たすコメント

6

7
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

8

きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意

4

4の先祖ツリーの取得
→L <= 3 <= R を満たすコメント

6

7
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

8

2にノードを追加
きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意

4

6

7
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

8

2にノードを追加
きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意
6

7

きのこfudやめろ
4

5

6

↑
L:R = 5:6を追加したい
さっきの深さ優先探索より
2:5の子に追加するのでこのノードのLR値は5:6になるはず
(親のノードのR値を追加しようとするノードのL値にする)
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

8

2にノードを追加
きのこ派怖いわー
2

5

>>2 たけのこ汚い
3

>>1 同意
6

7

きのこfudやめろ
4

5

6

↑
追加されたノード以降のLR値を再計算(+2する)
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

10

2にノードを追加
きのこ派怖いわー
2

7

>>2 たけのこ汚い
3

>>1 同意
8

9

きのこfudやめろ
4

5

6
解決策 : 入れ子集合モデル
たけのこ駆逐したい
1

10

2にノードを追加
きのこ派怖いわー
2

7

>>2 たけのこ汚い
3

>>1 同意
8

9

きのこfudやめろ
4

5

6
↑
追加
解決策 : 閉包テーブルモデル
id

comment

先祖

子孫

2

2

1

たけのこ派駆逐したい

1

1

2

4

2

きのこ派怖いわー

1

2

3

3

3

>>1 同意

1

4

4

4

4

>>2 たけのこ汚い

1

3
たけのこ駆逐したい

きのこ派怖いわー

>>2 たけのこ汚い

>>1 同意
解決策 : 閉包テーブルモデル
?

ノード同士の関係性を定義するテーブルを追加
する
?

直近の親子関係だけじゃなく、全体のパスを持つ
? 離れたノードの親子関係も
? 自分自身を参照するパスも含める

?

メリット

ツリーの取得、移動、ツリーの削除、ツリーの昇格、
マルチルート、複数の親への所属などとにかく柔軟
? 入れ子集合ほどは複雑じゃない
?

?

デメリット
柔軟過ぎる
? 入れ子ほどじゃないと言うだけでそこそこ複雑
? パステーブルのデータ量が激ふえする
?
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A
B
B

C
D
D

C
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

A

B
B

C
D
D

C
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

B

A

B

A

B

C
D
D

C
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

B

A

B

C

A

A

B

C

D
D

C
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

B

A

B

C

A
A

B

C

D

A

D
D

C
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

B

A

B

C

A
A

D

B

B

B

C

D

A

D

C
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

B

A

B

C

A
A

D

B

B

B

D

B

C

D

A

D

C
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

B

A

B

C

A
A

D

B

B

B

D

C

C

B

C

D

A

D

C
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

B

A

B

C

A
A

D

B

B

B

D

C

C

D

D

B

C

D

A

D

C
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

B

A

B

C

A
A

B

B

D

C

C

D

D

C

D

B

B

C

D

A

D

直近だけでなく全てのノードの親子関係を定義
パステーブルの1行は上図の矢印1本に相当する
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

B

A

B

C

A
A

D

B

B

B

D

C

C

D

D

B

C

D

A

D

Aの子孫ツリー
→Aを先祖として持つ子孫

C
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

B

A

B

C

A
A

D

B

B

B

D

C

C

D

D

B

C

D

A

D

Dの先祖ツリー
→Dを子孫として持つ先祖

C
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

B

A

B

C

A
A
B

B

B

D

C

C

D

D

C

D

E

B

C

D

A

D

E
E

E

A

E

Bの子としてEを追加
B
E
→自己参照追加
→Bを子孫として持つ先祖の子孫にEを追加
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

A

B

A

C

C

A

D

D

A

E

B

B

B

D

B

E

C

C

D

D

E

E

B

E

A

B

D

C

E

Bの子としてEを追加
→自己参照追加
→Bを子孫として持つ先祖の子孫にEを追加
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

A

B

A

C

C

A

D

D

A

E

B

B

B

D

B

E

C

C

D

D

E

E

B

E

A

B

D

C

E

Bのツリーをまるごと削除
→Bを子孫とする関係を削除
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

A

B

A

C

C

A

D

D

A

E

B

B

B

D

B

E

C

C

D

D

E

E

B

E

A

B

D

C

E

Bのツリーをまるごと削除
→Bを子孫とする関係を削除
→Bの子孫を子孫とする関係を削除
(Bを先祖とするノードを子孫として持つ関係)
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

A

C

C

C

B

A

B

C

C

D
E

D

E

Bのツリーをまるごと削除
→Bを子孫とする関係を削除
→Bの子孫を子孫とする関係を削除
(Bを先祖とするノードを子孫として持つ関係)
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

A

B

A

C

C

A

D

D

A

E

B

B

B

D

B

E

C

C

D

D

E

E

B

E

A

B

D

C

E

Bを削除
→Bを子孫とする関係を削除
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

A

B

A

C

C

A

D

D

A

E

B

B

B

D

B

E

C

C

D

D

E

E

B

E

A

B

D

C

E

Bを削除
→Bを子孫とする関係を削除
→Bを先祖とする関係を削除
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

A

C

A

D

C

A

E

D

C

C

D

D

E

E

B

E

A

B

D

C

E

Bを削除 → C, Eが自動的にAの子に昇格
→Bを子孫とする関係を削除
→Bを先祖とする関係を削除
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

A

B

A

C

C

A

D

D

A

E

B

B

B

D

B

E

C

C

D

D

E

E

B

E

A

B

D

C

E

BをCの子へ移動
→Bを子孫とする関係と
Bの先祖からBの子孫への関係を削除
(ただし自己参照を除く)
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

A

C

B

B

C

B

D

D

B

E

C

C

D

D

E

E

B

E

A

B

D

C

E

BをCの子へ移動
→Bを子孫とする関係と
Bの先祖からBの子孫への関係を削除
(ただし自己参照を除く)
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

B

A

A

A

A

D

A

C

A

E

B

B

C

B

C

B

D

C

D

D

B

E

C

E

C

C

D

D

E

E

B

E

A

B

D

C

E

BをCの子へ移動
→Cを子孫とする移動先サブツリーから
孤立中のBのツリーのノードへの全経路を
cross 箩辞颈苍で生成する
解決策 : 閉包テーブルモデル
node

先祖

子孫

A

A

A

D

D

A

B

E

E

A

C

C

A

D

D

A

E

B

B

B

D

B

E

C

B

C

C

C

D

C

E

B

E

A

C

B

BをCの子へ移動

D

E
まとめ
?

隣接リスト
?
?

?

経路列挙
?

?

?

シンプルかつツリー取得可能
ジェイウォーク

入れ子集合
?
?

?

?

シンプル
ツリー取得、操作が苦手

子孫、先祖ツリーの取得が可能
ノードの削除で子ノードが自動で昇格する
ツリー操作が死ぬほど複雑

閉包テーブル
?
?
?
?

入れ子集合に比べれば(比べればと言う程度)シンプル
先祖、子孫の取得、サブツリーごと削除、子の昇格、ツリー移動な
ど大体の事が出来る
その代わりツリー構造管理テーブルが必要
パステーブルのデータ量がめっちゃ増える
ナイーブツリー(素朴な木)
?

ツリー表現の解決策としては素朴過ぎると
言う意味

?

素朴故に多用される。

?

ただし常にナイーブツリー is 悪ではない

?

ツリーを表現する手法は他にもあるんだよ、
ということを覚えておきましょう
アンチパターンを用いていい場合
?

隣接リストでアプリの要件を満たせる場合
? 実際シンプル
? その他の手法(特に入れ子集合)はそれなりの複

雑さを持ち込むことになる
? 複雑さ is バグの元
?

利用DB製品が再帰クエリ構文をサポートす
る場合
? ぽすぐれ、SQLServer、Oracle、DB2

? 再帰クエリなら隣接リストでもツリー取得可
おわり
Ad

Recommended

例外设计における大罪
例外设计における大罪
Takuto Wada
?
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
?
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
?
笔辞蝉迟驳谤别厂蚕尝アンチハ?ターン
笔辞蝉迟驳谤别厂蚕尝アンチハ?ターン
Soudai Sone
?
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
?
イミュータブルデータモデル(入门编)
イミュータブルデータモデル(入门编)
Yoshitaka Kawashima
?
ドメイン駆动设计サンプルコードの彻底解説
ドメイン駆动设计サンプルコードの彻底解説
増田 亨
?
ソーシャルゲームのためのデータベース设计
ソーシャルゲームのためのデータベース设计
Yoshinori Matsunobu
?
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
?
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォーク
ke-m kamekoopa
?
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
?
オブジェクト指向プログラミングのためのモデリング入门
オブジェクト指向プログラミングのためのモデリング入门
増田 亨
?
ドメイン駆动设计のためのオブジェクト指向入门
ドメイン駆动设计のためのオブジェクト指向入门
増田 亨
?
イベント?ソーシングを知る
イベント?ソーシングを知る
Shuhei Fujita
?
ネットストーカー御用达翱厂滨狈罢ツール叠濒补肠办叠颈谤诲を触ってみた.辫辫迟虫
ネットストーカー御用达翱厂滨狈罢ツール叠濒补肠办叠颈谤诲を触ってみた.辫辫迟虫
Shota Shinogi
?
マイクロにしすぎた结果がこれだよ!
マイクロにしすぎた结果がこれだよ!
mosa siru
?
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
?
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
?
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
?
デキるプログラマだけが知っているコードレビュー7つの秘诀
デキるプログラマだけが知っているコードレビュー7つの秘诀
Masahiro Nishimi
?
リーンなコードを书こう:実践的なオブジェクト指向设计
リーンなコードを书こう:実践的なオブジェクト指向设计
増田 亨
?
顿辞肠办别谤コンテナで骋颈迟を使う
顿辞肠办别谤コンテナで骋颈迟を使う
Kazuhiro Suga
?
Javaコードが速く実?される秘密 - JITコンパイラ??(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実?される秘密 - JITコンパイラ??(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
?
本当は恐ろしい分散システムの话
本当は恐ろしい分散システムの话
Kumazaki Hiroki
?
イミュータブルデータモデル(世代编)
イミュータブルデータモデル(世代编)
Yoshitaka Kawashima
?
ArcFace: Additive Angular Margin Loss for Deep Face Recognition
ArcFace: Additive Angular Margin Loss for Deep Face Recognition
harmonylab
?
厂蚕尝アンチパターン~スパゲッティクエリ
厂蚕尝アンチパターン~スパゲッティクエリ
Itabashi Masayuki
?
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
?
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
Takuto Wada
?
ナイーフ?ツリーの入れ子集合
ナイーフ?ツリーの入れ子集合
Akura Pi
?

More Related Content

What's hot (20)

チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
?
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォーク
ke-m kamekoopa
?
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
?
オブジェクト指向プログラミングのためのモデリング入门
オブジェクト指向プログラミングのためのモデリング入门
増田 亨
?
ドメイン駆动设计のためのオブジェクト指向入门
ドメイン駆动设计のためのオブジェクト指向入门
増田 亨
?
イベント?ソーシングを知る
イベント?ソーシングを知る
Shuhei Fujita
?
ネットストーカー御用达翱厂滨狈罢ツール叠濒补肠办叠颈谤诲を触ってみた.辫辫迟虫
ネットストーカー御用达翱厂滨狈罢ツール叠濒补肠办叠颈谤诲を触ってみた.辫辫迟虫
Shota Shinogi
?
マイクロにしすぎた结果がこれだよ!
マイクロにしすぎた结果がこれだよ!
mosa siru
?
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
?
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
?
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
?
デキるプログラマだけが知っているコードレビュー7つの秘诀
デキるプログラマだけが知っているコードレビュー7つの秘诀
Masahiro Nishimi
?
リーンなコードを书こう:実践的なオブジェクト指向设计
リーンなコードを书こう:実践的なオブジェクト指向设计
増田 亨
?
顿辞肠办别谤コンテナで骋颈迟を使う
顿辞肠办别谤コンテナで骋颈迟を使う
Kazuhiro Suga
?
Javaコードが速く実?される秘密 - JITコンパイラ??(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実?される秘密 - JITコンパイラ??(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
?
本当は恐ろしい分散システムの话
本当は恐ろしい分散システムの话
Kumazaki Hiroki
?
イミュータブルデータモデル(世代编)
イミュータブルデータモデル(世代编)
Yoshitaka Kawashima
?
ArcFace: Additive Angular Margin Loss for Deep Face Recognition
ArcFace: Additive Angular Margin Loss for Deep Face Recognition
harmonylab
?
厂蚕尝アンチパターン~スパゲッティクエリ
厂蚕尝アンチパターン~スパゲッティクエリ
Itabashi Masayuki
?
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
?
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
?
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォーク
ke-m kamekoopa
?
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
?
オブジェクト指向プログラミングのためのモデリング入门
オブジェクト指向プログラミングのためのモデリング入门
増田 亨
?
ドメイン駆动设计のためのオブジェクト指向入门
ドメイン駆动设计のためのオブジェクト指向入门
増田 亨
?
イベント?ソーシングを知る
イベント?ソーシングを知る
Shuhei Fujita
?
ネットストーカー御用达翱厂滨狈罢ツール叠濒补肠办叠颈谤诲を触ってみた.辫辫迟虫
ネットストーカー御用达翱厂滨狈罢ツール叠濒补肠办叠颈谤诲を触ってみた.辫辫迟虫
Shota Shinogi
?
マイクロにしすぎた结果がこれだよ!
マイクロにしすぎた结果がこれだよ!
mosa siru
?
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
?
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
?
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
?
デキるプログラマだけが知っているコードレビュー7つの秘诀
デキるプログラマだけが知っているコードレビュー7つの秘诀
Masahiro Nishimi
?
リーンなコードを书こう:実践的なオブジェクト指向设计
リーンなコードを书こう:実践的なオブジェクト指向设计
増田 亨
?
顿辞肠办别谤コンテナで骋颈迟を使う
顿辞肠办别谤コンテナで骋颈迟を使う
Kazuhiro Suga
?
Javaコードが速く実?される秘密 - JITコンパイラ??(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実?される秘密 - JITコンパイラ??(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
?
本当は恐ろしい分散システムの话
本当は恐ろしい分散システムの话
Kumazaki Hiroki
?
イミュータブルデータモデル(世代编)
イミュータブルデータモデル(世代编)
Yoshitaka Kawashima
?
ArcFace: Additive Angular Margin Loss for Deep Face Recognition
ArcFace: Additive Angular Margin Loss for Deep Face Recognition
harmonylab
?
厂蚕尝アンチパターン~スパゲッティクエリ
厂蚕尝アンチパターン~スパゲッティクエリ
Itabashi Masayuki
?
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
?

Similar to SQLアンチパターン - ナイーブツリー (7)

SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
Takuto Wada
?
ナイーフ?ツリーの入れ子集合
ナイーフ?ツリーの入れ子集合
Akura Pi
?
任意粒度机能モデルに基づく动的型付けプログラミング言语向けソースコード検索手法の提案
任意粒度机能モデルに基づく动的型付けプログラミング言语向けソースコード検索手法の提案
Kamiya Toshihiro
?
ウェーブレット木の世界
ウェーブレット木の世界
Preferred Networks
?
Isolation forest
Isolation forest
kataware
?
データを工夫して记録するデータ构造
データを工夫して记録するデータ构造
Katsutoshi Nagaoka
?
インターン讲义8日目「データ构造」
インターン讲义8日目「データ构造」
Hatena::Engineering
?
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
Takuto Wada
?
ナイーフ?ツリーの入れ子集合
ナイーフ?ツリーの入れ子集合
Akura Pi
?
任意粒度机能モデルに基づく动的型付けプログラミング言语向けソースコード検索手法の提案
任意粒度机能モデルに基づく动的型付けプログラミング言语向けソースコード検索手法の提案
Kamiya Toshihiro
?
ウェーブレット木の世界
ウェーブレット木の世界
Preferred Networks
?
Isolation forest
Isolation forest
kataware
?
データを工夫して记録するデータ构造
データを工夫して记録するデータ构造
Katsutoshi Nagaoka
?
インターン讲义8日目「データ构造」
インターン讲义8日目「データ构造」
Hatena::Engineering
?
Ad

More from ke-m kamekoopa (15)

Kvwatcher
Kvwatcher
ke-m kamekoopa
?
PyKon JP 2014
PyKon JP 2014
ke-m kamekoopa
?
Scala.js
Scala.js
ke-m kamekoopa
?
设计してますか?
设计してますか?
ke-m kamekoopa
?
Interlli jとplayとjavaとscala
Interlli jとplayとjavaとscala
ke-m kamekoopa
?
関数型もモナドも分からなくても厂肠补濒补と言う言语は便利らしい
関数型もモナドも分からなくても厂肠补濒补と言う言语は便利らしい
ke-m kamekoopa
?
デプロイツール贵补产谤颈肠
デプロイツール贵补产谤颈肠
ke-m kamekoopa
?
笔濒补测で作る飞别产蝉辞肠办别迟サーバ
笔濒补测で作る飞别产蝉辞肠办别迟サーバ
ke-m kamekoopa
?
ぎっとの「ぎ」
ぎっとの「ぎ」
ke-m kamekoopa
?
# Rabbitサンプル
# Rabbitサンプル
ke-m kamekoopa
?
デプロイメントパイプラインって何?
デプロイメントパイプラインって何?
ke-m kamekoopa
?
継続的にデリバリーって何?
継続的にデリバリーって何?
ke-m kamekoopa
?
Play frameworkをエヴァンジェる
Play frameworkをエヴァンジェる
ke-m kamekoopa
?
Test
Test
ke-m kamekoopa
?
Interlli jとplayとjavaとscala
Interlli jとplayとjavaとscala
ke-m kamekoopa
?
関数型もモナドも分からなくても厂肠补濒补と言う言语は便利らしい
関数型もモナドも分からなくても厂肠补濒补と言う言语は便利らしい
ke-m kamekoopa
?
デプロイツール贵补产谤颈肠
デプロイツール贵补产谤颈肠
ke-m kamekoopa
?
笔濒补测で作る飞别产蝉辞肠办别迟サーバ
笔濒补测で作る飞别产蝉辞肠办别迟サーバ
ke-m kamekoopa
?
デプロイメントパイプラインって何?
デプロイメントパイプラインって何?
ke-m kamekoopa
?
継続的にデリバリーって何?
継続的にデリバリーって何?
ke-m kamekoopa
?
Play frameworkをエヴァンジェる
Play frameworkをエヴァンジェる
ke-m kamekoopa
?
Ad

Recently uploaded (7)

PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
?
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
iPride Co., Ltd.
?
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
Takuma Oda
?
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
?
色について.pptx .
色について.pptx .
iPride Co., Ltd.
?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
iPride Co., Ltd.
?
Protect Your IoT Data with UbiBot's Private Platform.pptx
Protect Your IoT Data with UbiBot's Private Platform.pptx
ユビボット 株式会社
?
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
?
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
iPride Co., Ltd.
?
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
Takuma Oda
?
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
iPride Co., Ltd.
?
Protect Your IoT Data with UbiBot's Private Platform.pptx
Protect Your IoT Data with UbiBot's Private Platform.pptx
ユビボット 株式会社
?

SQLアンチパターン - ナイーブツリー