SlideShare una empresa de Scribd logo
1 de 20
Descargar para leer sin conexión
Nippondanji 氏に
怒られても仕方ない
配列型とJSON型の
使い方 (in PostgreSQL)
Makoto Kuwata
http://www.kuwata-lab.com/
https://github.com/kwatch/
理論から学ぶデータベース実践入門Night LT
copyright 2015 kuwata-lab.com all rights reserved.©
配列型とは?
複数の値を持てるデータ型
集合と違い、順番を保持できるのがポイント
>> select '{34.6582, 139.7020}'::float[];
float8
------------------
{34.6582,139.702}
(1 row)
floatの配列型
へのキャスト
'{ }' が配列の
リテラル
copyright 2015 kuwata-lab.com all rights reserved.©
JSON型とは?
JSONデータを保持できるデータ型
キーと値の組や、構造が不定なデータが保存できる
>> select '{"type":"string", "required":true}'::json;
json
------------------------------------
{"type":"string", "required":true}
(1 row)
JSON型
へのキャスト
copyright 2015 kuwata-lab.com all rights reserved.©
なんで怒られちゃうの?
第一正規化を平然と無視してるから
>> create table bookmark (
id serial primary key
, url text not null
, title text not null
, tags text[]
);
>> select * from bookmark;
id | url | title | tags
----+---------------------+---------+-----------------
1 | https://example.com | Example | {'news','game'}
(1 row)
1つのカラムに複数の値!
しかも順序つき!
copyright 2015 kuwata-lab.com all rights reserved.©
話は変わって、サンプルデータ
ID Name
101 T-Shirt
102 Sweater
Product ID Color Code
101 White W
101 Black B
102 White WH
102 Ivory IV
102 Gray GR
product テーブル coloring テーブル
copyright 2015 kuwata-lab.com all rights reserved.©
joinすると…
ID Name Code Color
101 T-Shirt W White
101 T-Shirt B Black
102 Sweater WH White
102 Sweater IV Ivory
102 Sweater GR Gray
from product join coloring
on product.id = coloring.product_id
copyright 2015 kuwata-lab.com all rights reserved.©
でも欲しいのは…
ID Name (Code, Color)
101 T-Shirt
(W, White)
(B, Black)
102 Sweater
(WH, White)
(IV, Ivory)
(GR, Gray)
1 : N の関係を保ったまま結果を取り出したい
1 : N の形で取得したい
copyright 2015 kuwata-lab.com all rights reserved.©
join
>> select product.id, product.name, c.color
from product
left join coloring c
on product.id = c.product_id
;
id | name | color
-----+---------+-------
101 | T-Shirt | White
101 | T-Shirt | Black
102 | Sweater | White
102 | Sweater | Ivory
102 | Sweater | Gray
(5 rows)
これがうれしくない
copyright 2015 kuwata-lab.com all rights reserved.©
集約関数 array_agg()
>> select product.id, product.name, coloring.color
, array_agg(c.color) as colors
from product
left join coloring c
on product.id = c.product_id
group by product.id, product.name
;
id | name | colors
-----+---------+--------------------
101 | T-Shirt | {White,Black}
102 | Sweater | {White,Ivory,Gray}
(2 rows)
複数の値を配列型で取得!
1 : N で取り出せてる!
copyright 2015 kuwata-lab.com all rights reserved.©
行コンストラクタ
>> select product.id, product.name
, array_agg((c.code, c.color)) as colors
from product
left join coloring c
on product.id = c.product_id
group by product.id, product.name
;
id | name | colors
-----+---------+----------------------------------------
101 | T-Shirt | {"(W,White)","(B,Black)"}
102 | Sweater | {"(WH,White)","(IV,Ivory)","(GR,Gray)"}
(2 rows)
または row(c.code, c.color)
行の配列だけど
パースが必要になる
copyright 2015 kuwata-lab.com all rights reserved.©
集約関数 json_agg()
>> select product.id, product.name
, json_agg((c.code, c.color)) as colors
from product
left join coloring c
on product.id = c.product_id
group by product.id, product.name
;
id | name | colors
-----+---------+-----------------------------
101 | T-Shirt | [{"f1":"W","f2":"White"}, +
| | {"f1":"B","f2":"Black"}]
102 | Sweater | [{"f1":"WH","f2":"White"}, +
| | {"f1":"IV","f2":"Ivory"}, +
| | {"f1":"GR","f2":"Gray"}]
(2 rows)
キーが f1, f2, ... に
なってしまう ;(
copyright 2015 kuwata-lab.com all rights reserved.©
複合型
>> create type code_name as (code text, name text);
>> select product.id, product.name
, json_agg((c.code, c.color)::code_name) as colors
from product
left join coloring c
on product.id = c.product_id
group by product.id, product.name;
id | name | colors
-----+---------+---------------------------------
101 | T-Shirt | [{"code":"W","name":"White"}, +
| | {"code":"B","name":"Black"}]
102 | Sweater | [{"code":"WH","name":"White"}, +
| | {"code":"IV","name":"Ivory"}, +
| | {"code":"GR","name":"Gray"}]
(2 rows)
code_name型へ
キャストすると
キー名が設定される
copyright 2015 kuwata-lab.com all rights reserved.©
相関サブクエリ
>> select product.id, product.name
, ( select json_agg(t.*)
from ( select code, color from coloring c2
where c2.product_id = product.id
) as t
) as colors
from product
left join coloring c
on product.id = c.product_id
group by product.id, product.name
;
...(前ページと同じ結果なので省略)...
うまくいくけど
三重の入れ子は
複雑すぎる…
copyright 2015 kuwata-lab.com all rights reserved.©
問題点
使いやすいとはとても言えない
SQLごとに複合型を定義するわけにもいかないし、

かといって相関サブクエリだと複雑すぎる
DBドライバが配列型やJSON型に未対応
Python用以外は全滅に近い (PHPもRubyもJavaもダメ)、

いったんtext型として取得してからパースする必要あり
copyright 2015 kuwata-lab.com all rights reserved.©
所感
配列型やJSON型を嫌う人は結構いる
第一正規化に反するので、気持ちはわかる
クエリ結果に使うのはいいんじゃない?
大事なのはテーブルが正規化されていることであり、

クエリ結果にまで同じことを求める必要はない
1 : N のまま取り出せるのはやはり便利
とても自然であり、本来あるべき姿

(なぜ今まで出来なかったのか?)
copyright 2015 kuwata-lab.com all rights reserved.©
考察
我々が欲しいのはRelationalなのか?
欲しいのは速くて便利でトランザクションが使えるDBであり、
必ずしもRelationalである必要はない
ID Name Code Color
101 T-Shirt W White
101 T-Shirt B Black
102 Sweate
r
WH White
102 Sweate
r
IV Ivory
102 Sweate
r
GR Gray
ID Name Code,Color
101 T-Shirt (W, White)
(B, Black)
102 Sweater (WH, White)
(IV, Ivory)
(GR, Gray)
正直、tupleの集合より 木構造のほうが便利やで
こんなこと言ってたら
怒られても仕方ない
copyright 2015 kuwata-lab.com all rights reserved.©
まとめ
配列型とJSON型の集約関数を使うと、

1 : N を 1 : N のまま取り出せるよ!
array_agg() と json_agg()
現状では使いやすくはない
複合型の定義も相関サブクエリもしんどい、

DBドライバの対応状況はもっとしんどい
copyright 2015 kuwata-lab.com all rights reserved.©
PostgreSQLに興味がわいたら
2015-11-27(Fri)
詳細は「ポスグレ カンファレンス 2015」でggr
公式バナーなのに「e」が抜けているけど
たぶんデザイナーじゃない人が作ってるし
大目に見てあげて!
copyright 2015 kuwata-lab.com all rights reserved.©
使い方 より 作り方 を知りたいなら
内部構造から学ぶPostgreSQL
̶ 設計・運用計画の鉄則 ̶
勝俣智成、佐伯昌樹、原田登志
技術評論社
2014-09-04
copyright 2015 kuwata-lab.com all rights reserved.©
おしまい

Más contenido relacionado

La actualidad más candente

マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみたKeita Tsukamoto
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話JustSystems Corporation
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことgree_tech
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCdisc99_
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング佑哉 廣岡
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることShingo Fukui
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーションssuser070fa9
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界Yoshinori Nakanishi
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)NTT DATA Technology & Innovation
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
AWS Black Belt Online Seminar AWS CloudFormation アップデート
AWS Black Belt Online Seminar AWS CloudFormation アップデートAWS Black Belt Online Seminar AWS CloudFormation アップデート
AWS Black Belt Online Seminar AWS CloudFormation アップデートAmazon Web Services Japan
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティスAmazon Web Services Japan
 

La actualidad más candente (20)

マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
AWS Black Belt Online Seminar AWS CloudFormation アップデート
AWS Black Belt Online Seminar AWS CloudFormation アップデートAWS Black Belt Online Seminar AWS CloudFormation アップデート
AWS Black Belt Online Seminar AWS CloudFormation アップデート
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 

Destacado

正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?kwatch
 
Cより速いRubyプログラム
Cより速いRubyプログラムCより速いRubyプログラム
Cより速いRubyプログラムkwatch
 
Emacsいじめの現場
Emacsいじめの現場Emacsいじめの現場
Emacsいじめの現場Eric Sartre
 
Gunosy Go lang study #6 net http url
Gunosy Go lang study #6 net http urlGunosy Go lang study #6 net http url
Gunosy Go lang study #6 net http urlInnami Satoshi
 
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会Keisuke Utsumi
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門kwatch
 

Destacado (6)

正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
 
Cより速いRubyプログラム
Cより速いRubyプログラムCより速いRubyプログラム
Cより速いRubyプログラム
 
Emacsいじめの現場
Emacsいじめの現場Emacsいじめの現場
Emacsいじめの現場
 
Gunosy Go lang study #6 net http url
Gunosy Go lang study #6 net http urlGunosy Go lang study #6 net http url
Gunosy Go lang study #6 net http url
 
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 

Similar a Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方

Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureRyota Watabe
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 Nobuaki Oshiro
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSNoriyoshi Shinoda
 
generate_series関数使い込み
generate_series関数使い込みgenerate_series関数使い込み
generate_series関数使い込みkawarasho
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101Nobuaki Oshiro
 
20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrowKohei KaiGai
 
Gura プログラミング言語の紹介
Gura プログラミング言語の紹介Gura プログラミング言語の紹介
Gura プログラミング言語の紹介Yutaka Saito
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Ryo Suzuki
 
S02 t1 sta_py_tsuji_0702_slides
S02 t1 sta_py_tsuji_0702_slidesS02 t1 sta_py_tsuji_0702_slides
S02 t1 sta_py_tsuji_0702_slidesTakeshi Akutsu
 
MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要Shinya Sugiyama
 
Java puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta JapanJava puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta JapanYoshio Terada
 
[db tech showcase Tokyo 2018] #dbts2018 #D27 『Verticaの進化が止まらない! 機械学習、データレイク、処...
[db tech showcase Tokyo 2018] #dbts2018 #D27 『Verticaの進化が止まらない! 機械学習、データレイク、処...[db tech showcase Tokyo 2018] #dbts2018 #D27 『Verticaの進化が止まらない! 機械学習、データレイク、処...
[db tech showcase Tokyo 2018] #dbts2018 #D27 『Verticaの進化が止まらない! 機械学習、データレイク、処...Insight Technology, Inc.
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)Hiro H.
 

Similar a Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方 (16)

Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database Architecture
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
 
generate_series関数使い込み
generate_series関数使い込みgenerate_series関数使い込み
generate_series関数使い込み
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101
 
20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow
 
Gura プログラミング言語の紹介
Gura プログラミング言語の紹介Gura プログラミング言語の紹介
Gura プログラミング言語の紹介
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発
 
S02 t1 sta_py_tsuji_0702_slides
S02 t1 sta_py_tsuji_0702_slidesS02 t1 sta_py_tsuji_0702_slides
S02 t1 sta_py_tsuji_0702_slides
 
MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要
 
Aaなゲームをjsで
AaなゲームをjsでAaなゲームをjsで
Aaなゲームをjsで
 
Aaなゲームをjsで
AaなゲームをjsでAaなゲームをjsで
Aaなゲームをjsで
 
Java puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta JapanJava puzzlers 2013 at JavaFesta Japan
Java puzzlers 2013 at JavaFesta Japan
 
[db tech showcase Tokyo 2018] #dbts2018 #D27 『Verticaの進化が止まらない! 機械学習、データレイク、処...
[db tech showcase Tokyo 2018] #dbts2018 #D27 『Verticaの進化が止まらない! 機械学習、データレイク、処...[db tech showcase Tokyo 2018] #dbts2018 #D27 『Verticaの進化が止まらない! 機械学習、データレイク、処...
[db tech showcase Tokyo 2018] #dbts2018 #D27 『Verticaの進化が止まらない! 機械学習、データレイク、処...
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
 

Más de kwatch

How to make the fastest Router in Python
How to make the fastest Router in PythonHow to make the fastest Router in Python
How to make the fastest Router in Pythonkwatch
 
Migr8.rb チュートリアル
Migr8.rb チュートリアルMigr8.rb チュートリアル
Migr8.rb チュートリアルkwatch
 
なんでもID
なんでもIDなんでもID
なんでもIDkwatch
 
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方kwatch
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐkwatch
 
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)kwatch
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!kwatch
 
PHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するPHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するkwatch
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?kwatch
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Pythonkwatch
 
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策kwatch
 
Pretty Good Branch Strategy for Git/Mercurial
Pretty Good Branch Strategy for Git/MercurialPretty Good Branch Strategy for Git/Mercurial
Pretty Good Branch Strategy for Git/Mercurialkwatch
 
Oktest - a new style testing library for Python -
Oktest - a new style testing library for Python -Oktest - a new style testing library for Python -
Oktest - a new style testing library for Python -kwatch
 
文字列結合のベンチマークをいろんな処理系でやってみた
文字列結合のベンチマークをいろんな処理系でやってみた文字列結合のベンチマークをいろんな処理系でやってみた
文字列結合のベンチマークをいろんな処理系でやってみたkwatch
 
I have something to say about the buzz word "From Java to Ruby"
I have something to say about the buzz word "From Java to Ruby"I have something to say about the buzz word "From Java to Ruby"
I have something to say about the buzz word "From Java to Ruby"kwatch
 
Javaより速いLL用テンプレートエンジン
Javaより速いLL用テンプレートエンジンJavaより速いLL用テンプレートエンジン
Javaより速いLL用テンプレートエンジンkwatch
 
Underlaying Technology of Modern O/R Mapper
Underlaying Technology of Modern O/R MapperUnderlaying Technology of Modern O/R Mapper
Underlaying Technology of Modern O/R Mapperkwatch
 
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -kwatch
 
Benchmarker - A Good Friend for Performance
Benchmarker - A Good Friend for PerformanceBenchmarker - A Good Friend for Performance
Benchmarker - A Good Friend for Performancekwatch
 
How to Create a High-Speed Template Engine in Python
How to Create a High-Speed Template Engine in PythonHow to Create a High-Speed Template Engine in Python
How to Create a High-Speed Template Engine in Pythonkwatch
 

Más de kwatch (20)

How to make the fastest Router in Python
How to make the fastest Router in PythonHow to make the fastest Router in Python
How to make the fastest Router in Python
 
Migr8.rb チュートリアル
Migr8.rb チュートリアルMigr8.rb チュートリアル
Migr8.rb チュートリアル
 
なんでもID
なんでもIDなんでもID
なんでもID
 
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
PHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するPHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較する
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Python
 
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
 
Pretty Good Branch Strategy for Git/Mercurial
Pretty Good Branch Strategy for Git/MercurialPretty Good Branch Strategy for Git/Mercurial
Pretty Good Branch Strategy for Git/Mercurial
 
Oktest - a new style testing library for Python -
Oktest - a new style testing library for Python -Oktest - a new style testing library for Python -
Oktest - a new style testing library for Python -
 
文字列結合のベンチマークをいろんな処理系でやってみた
文字列結合のベンチマークをいろんな処理系でやってみた文字列結合のベンチマークをいろんな処理系でやってみた
文字列結合のベンチマークをいろんな処理系でやってみた
 
I have something to say about the buzz word "From Java to Ruby"
I have something to say about the buzz word "From Java to Ruby"I have something to say about the buzz word "From Java to Ruby"
I have something to say about the buzz word "From Java to Ruby"
 
Javaより速いLL用テンプレートエンジン
Javaより速いLL用テンプレートエンジンJavaより速いLL用テンプレートエンジン
Javaより速いLL用テンプレートエンジン
 
Underlaying Technology of Modern O/R Mapper
Underlaying Technology of Modern O/R MapperUnderlaying Technology of Modern O/R Mapper
Underlaying Technology of Modern O/R Mapper
 
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
 
Benchmarker - A Good Friend for Performance
Benchmarker - A Good Friend for PerformanceBenchmarker - A Good Friend for Performance
Benchmarker - A Good Friend for Performance
 
How to Create a High-Speed Template Engine in Python
How to Create a High-Speed Template Engine in PythonHow to Create a High-Speed Template Engine in Python
How to Create a High-Speed Template Engine in Python
 

Último

論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 

Último (11)

論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方

  • 1. Nippondanji 氏に 怒られても仕方ない 配列型とJSON型の 使い方 (in PostgreSQL) Makoto Kuwata http://www.kuwata-lab.com/ https://github.com/kwatch/ 理論から学ぶデータベース実践入門Night LT
  • 2. copyright 2015 kuwata-lab.com all rights reserved.© 配列型とは? 複数の値を持てるデータ型 集合と違い、順番を保持できるのがポイント >> select '{34.6582, 139.7020}'::float[]; float8 ------------------ {34.6582,139.702} (1 row) floatの配列型 へのキャスト '{ }' が配列の リテラル
  • 3. copyright 2015 kuwata-lab.com all rights reserved.© JSON型とは? JSONデータを保持できるデータ型 キーと値の組や、構造が不定なデータが保存できる >> select '{"type":"string", "required":true}'::json; json ------------------------------------ {"type":"string", "required":true} (1 row) JSON型 へのキャスト
  • 4. copyright 2015 kuwata-lab.com all rights reserved.© なんで怒られちゃうの? 第一正規化を平然と無視してるから >> create table bookmark ( id serial primary key , url text not null , title text not null , tags text[] ); >> select * from bookmark; id | url | title | tags ----+---------------------+---------+----------------- 1 | https://example.com | Example | {'news','game'} (1 row) 1つのカラムに複数の値! しかも順序つき!
  • 5. copyright 2015 kuwata-lab.com all rights reserved.© 話は変わって、サンプルデータ ID Name 101 T-Shirt 102 Sweater Product ID Color Code 101 White W 101 Black B 102 White WH 102 Ivory IV 102 Gray GR product テーブル coloring テーブル
  • 6. copyright 2015 kuwata-lab.com all rights reserved.© joinすると… ID Name Code Color 101 T-Shirt W White 101 T-Shirt B Black 102 Sweater WH White 102 Sweater IV Ivory 102 Sweater GR Gray from product join coloring on product.id = coloring.product_id
  • 7. copyright 2015 kuwata-lab.com all rights reserved.© でも欲しいのは… ID Name (Code, Color) 101 T-Shirt (W, White) (B, Black) 102 Sweater (WH, White) (IV, Ivory) (GR, Gray) 1 : N の関係を保ったまま結果を取り出したい 1 : N の形で取得したい
  • 8. copyright 2015 kuwata-lab.com all rights reserved.© join >> select product.id, product.name, c.color from product left join coloring c on product.id = c.product_id ; id | name | color -----+---------+------- 101 | T-Shirt | White 101 | T-Shirt | Black 102 | Sweater | White 102 | Sweater | Ivory 102 | Sweater | Gray (5 rows) これがうれしくない
  • 9. copyright 2015 kuwata-lab.com all rights reserved.© 集約関数 array_agg() >> select product.id, product.name, coloring.color , array_agg(c.color) as colors from product left join coloring c on product.id = c.product_id group by product.id, product.name ; id | name | colors -----+---------+-------------------- 101 | T-Shirt | {White,Black} 102 | Sweater | {White,Ivory,Gray} (2 rows) 複数の値を配列型で取得! 1 : N で取り出せてる!
  • 10. copyright 2015 kuwata-lab.com all rights reserved.© 行コンストラクタ >> select product.id, product.name , array_agg((c.code, c.color)) as colors from product left join coloring c on product.id = c.product_id group by product.id, product.name ; id | name | colors -----+---------+---------------------------------------- 101 | T-Shirt | {"(W,White)","(B,Black)"} 102 | Sweater | {"(WH,White)","(IV,Ivory)","(GR,Gray)"} (2 rows) または row(c.code, c.color) 行の配列だけど パースが必要になる
  • 11. copyright 2015 kuwata-lab.com all rights reserved.© 集約関数 json_agg() >> select product.id, product.name , json_agg((c.code, c.color)) as colors from product left join coloring c on product.id = c.product_id group by product.id, product.name ; id | name | colors -----+---------+----------------------------- 101 | T-Shirt | [{"f1":"W","f2":"White"}, + | | {"f1":"B","f2":"Black"}] 102 | Sweater | [{"f1":"WH","f2":"White"}, + | | {"f1":"IV","f2":"Ivory"}, + | | {"f1":"GR","f2":"Gray"}] (2 rows) キーが f1, f2, ... に なってしまう ;(
  • 12. copyright 2015 kuwata-lab.com all rights reserved.© 複合型 >> create type code_name as (code text, name text); >> select product.id, product.name , json_agg((c.code, c.color)::code_name) as colors from product left join coloring c on product.id = c.product_id group by product.id, product.name; id | name | colors -----+---------+--------------------------------- 101 | T-Shirt | [{"code":"W","name":"White"}, + | | {"code":"B","name":"Black"}] 102 | Sweater | [{"code":"WH","name":"White"}, + | | {"code":"IV","name":"Ivory"}, + | | {"code":"GR","name":"Gray"}] (2 rows) code_name型へ キャストすると キー名が設定される
  • 13. copyright 2015 kuwata-lab.com all rights reserved.© 相関サブクエリ >> select product.id, product.name , ( select json_agg(t.*) from ( select code, color from coloring c2 where c2.product_id = product.id ) as t ) as colors from product left join coloring c on product.id = c.product_id group by product.id, product.name ; ...(前ページと同じ結果なので省略)... うまくいくけど 三重の入れ子は 複雑すぎる…
  • 14. copyright 2015 kuwata-lab.com all rights reserved.© 問題点 使いやすいとはとても言えない SQLごとに複合型を定義するわけにもいかないし、
 かといって相関サブクエリだと複雑すぎる DBドライバが配列型やJSON型に未対応 Python用以外は全滅に近い (PHPもRubyもJavaもダメ)、
 いったんtext型として取得してからパースする必要あり
  • 15. copyright 2015 kuwata-lab.com all rights reserved.© 所感 配列型やJSON型を嫌う人は結構いる 第一正規化に反するので、気持ちはわかる クエリ結果に使うのはいいんじゃない? 大事なのはテーブルが正規化されていることであり、
 クエリ結果にまで同じことを求める必要はない 1 : N のまま取り出せるのはやはり便利 とても自然であり、本来あるべき姿
 (なぜ今まで出来なかったのか?)
  • 16. copyright 2015 kuwata-lab.com all rights reserved.© 考察 我々が欲しいのはRelationalなのか? 欲しいのは速くて便利でトランザクションが使えるDBであり、 必ずしもRelationalである必要はない ID Name Code Color 101 T-Shirt W White 101 T-Shirt B Black 102 Sweate r WH White 102 Sweate r IV Ivory 102 Sweate r GR Gray ID Name Code,Color 101 T-Shirt (W, White) (B, Black) 102 Sweater (WH, White) (IV, Ivory) (GR, Gray) 正直、tupleの集合より 木構造のほうが便利やで こんなこと言ってたら 怒られても仕方ない
  • 17. copyright 2015 kuwata-lab.com all rights reserved.© まとめ 配列型とJSON型の集約関数を使うと、
 1 : N を 1 : N のまま取り出せるよ! array_agg() と json_agg() 現状では使いやすくはない 複合型の定義も相関サブクエリもしんどい、
 DBドライバの対応状況はもっとしんどい
  • 18. copyright 2015 kuwata-lab.com all rights reserved.© PostgreSQLに興味がわいたら 2015-11-27(Fri) 詳細は「ポスグレ カンファレンス 2015」でggr 公式バナーなのに「e」が抜けているけど たぶんデザイナーじゃない人が作ってるし 大目に見てあげて!
  • 19. copyright 2015 kuwata-lab.com all rights reserved.© 使い方 より 作り方 を知りたいなら 内部構造から学ぶPostgreSQL ̶ 設計・運用計画の鉄則 ̶ 勝俣智成、佐伯昌樹、原田登志 技術評論社 2014-09-04
  • 20. copyright 2015 kuwata-lab.com all rights reserved.© おしまい