Suche senden
Hochladen
SQLアンチパターン~ファントムファイル
•
16 gefällt mir
•
9,957 views
Itabashi Masayuki
Folgen
社内SQLアンチパターン輪読会の資料、第11章ファントムファイル(幻のファイル)です。
Weniger lesen
Mehr lesen
Ingenieurwesen
Melden
Teilen
Melden
Teilen
1 von 42
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
目grep入門 +解説
目grep入門 +解説
murachue
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
Takaya Saeki
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
Empfohlen
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
目grep入門 +解説
目grep入門 +解説
murachue
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
Takaya Saeki
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
NTT DATA Technology & Innovation
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
mosa siru
AWSではじめるMLOps
AWSではじめるMLOps
MariOhbuchi
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
Koichiro Matsuoka
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
ke-m kamekoopa
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
Yoshitaka Kawashima
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Teppei Sato
Guide To AGPL
Guide To AGPL
Mikiya Okuno
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
AWS Black Belt Techシリーズ Amazon Kinesis
AWS Black Belt Techシリーズ Amazon Kinesis
Amazon Web Services Japan
Weitere ähnliche Inhalte
Was ist angesagt?
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
NTT DATA Technology & Innovation
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
mosa siru
AWSではじめるMLOps
AWSではじめるMLOps
MariOhbuchi
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
Koichiro Matsuoka
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
ke-m kamekoopa
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
Yoshitaka Kawashima
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Teppei Sato
Guide To AGPL
Guide To AGPL
Mikiya Okuno
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
AWS Black Belt Techシリーズ Amazon Kinesis
AWS Black Belt Techシリーズ Amazon Kinesis
Amazon Web Services Japan
Was ist angesagt?
(20)
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
AWSではじめるMLOps
AWSではじめるMLOps
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Guide To AGPL
Guide To AGPL
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
AWS Black Belt Techシリーズ Amazon Kinesis
AWS Black Belt Techシリーズ Amazon Kinesis
SQLアンチパターン~ファントムファイル
1.
SQLアンチパターン ~ファントムファイル~ CB部ADチーム 板橋正之 2014/05/07
2.
とあるところに 画像とコメントをアップロードすると 一覧表示するサービスが ありました。
3.
A====== ======= ======= ======= A====== ======= ======= ======= XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX アップロード
4.
ある日、 サーバに障害が発生しました。
5.
A====== ======= ======= ======= XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX
6.
こんなこともあろうかと データベースのバックアップを 取っていたのでリカバリを かけました。
7.
A====== ======= ======= ======= XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX リカバリ
8.
データベースは無事復旧しました が
9.
× A====== ======= ======= ======= XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX リカバリ × ×
10.
画像が表示されませんorz
11.
何故か!?
12.
バックアップ対象 /var/upload/img/ データベース Hiyoko.jpg Roads.jpg Penguis.jpg reportID
comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg A====== ======= ======= ======= アップロード アプリ
13.
サイズが大きくなりやすい 画像ファイル(バイナリ)は データベースではなく ファイルシステムに 保存する仕組み。
14.
目的: 画像をはじめとする 大容量メディアファイルを格納する
15.
アンチパターン: 物理ファイルの使用を 必須と思い込む
16.
注意 物理ファイルを「使用する」 ではなく 「必須と思い込む」が アンチパターン
17.
このアンチパターンに陥ると
18.
/var/upload/img/ データベース Hiyoko.jpg Roads.jpg Penguis.jpg reportID
comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg ファイルの削除時の問題 この行を 削除しても 自動的には 削除されない
19.
Aさんの処理 Bさんの処理 1.トランザクション開始 2.reportID:002のデータを 削除 3.Roads.jpgを削除 1.トランザクション開始 2.reportID:002のデータを参照 ・
3.画像ファイルを参照 ・ ・ x.コミット /var/upload/img/ データベース Hiyoko.jpg Roads.jpg Penguis.jpg reportID comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg トランザクション分離の問題 コメントは参照できるけど 画像が取得できない!?
20.
Aさんの処理 1.トランザクション開始 2.reportID:002のデータを 削除 3.Roads.jpgを削除 例外発生 ロールバック! /var/upload/img/ データベース Hiyoko.jpg Roads.jpg
Penguis.jpg reportID comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg ロールバック時の問題 データベースのデータは 元に戻っても 画像は消えたまま
21.
バックアップ バックアップ Aさんの処理 1.トランザクション開始 2.reportID:002のデータを 削除 3.Roads.jpgを削除 ・ ・ ・ x.コミット /var/upload/img/ データベース Hiyoko.jpg Roads.jpg Penguis.jpg reportID
comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg バックアップツール使用時における問題 reportID comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg Hiyoko.jpg Penguis.jpg バックアップ ツール バックアップ コマンド トランザクションや 参照整合制約などを 考慮して矛盾なく バックアップ
22.
/var/upload/img/ データベース Hiyoko.jpg Penguis.jpg reportID comment
imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg ファイルはSQLデータ型ではない SQLアクセス権限使用時における問題 単なる文字列 - 文字列であること以外に内容の保証はしない - BMSは実際のファイルが存在することの検証はし ない。 - ファイルが変更、削除、移動しても自動的に更新 されない。 - OSファイルの命名規則に従わない(大文字小文 字の区別や使用禁止文字)。 テーブルや列への アクセス権限とは無関係 OSファイルの適切なパーミッションを行う必要が ある。/var/www/html/配下などにファイルを保 存してしまうと予期せぬ参照が行われる可能性 がある。
23.
アンチパターンの見つけ方
24.
次の質問への答えが曖昧であったり、即答できないようである ならば、きちんと検討されないまま、外部ファイルの使用が採用 されている可能性が高い。 • 「データバックアップとリストアの手順は確立されているか」、「バックアッ プの検証方法はどうか」、「クリーンサーバーやバックアップを実施した サーバーとは別サーバーで、データのリストアをテストしたか」 • 「画像が増える一方になるのではなく、不要になった時にシステムから削 除されるような仕組みになっているか」、「不要な画像ファイルを削除する 手順はあるか」、「その手順は自動化されているか、それとも手動か」 •
「画像ファイルへのアクセス権を持っているアプリケーションユーザは誰 か」、「アクセス権はどのように適用されているか」、「権限を持たない画 像を参照するリクエストをした場合、ユーザには何が表示されるか」 • 「画像に対する変更をキャンセルできるか」、「キャンセルできる場合、ア プリケーションは前の状態に復旧できるか」
25.
いろいろ書いてあるけど 画像や動画扱う場合は 大抵やっている。 大事なのは検討したか否か。
26.
アンチパターンを用いてよい場合
27.
データベースの容量を減らせる
28.
データベースの容量を減らせる =バックアップが短時間 =バックアップファイルの容量も
29.
メディアファイルは データベース外にあるので 単体や一括での扱いが楽
30.
アンチパターンにメリットがあって 問題点が深刻じゃなければ 採用もおk
31.
大容量メディアファイルを外部ファ イルに格納することが常に最善の 方法であるという一般論に従うの ではなく、十分な情報に基づき、 よく検討して上で判断
32.
解決策: 必要に応じてBLOB型を採用する (DBMS内で完結)
33.
BLOB型を採用した場合、「アンチパターン」のすべての問題が 解決できる。 • 画像データはデータベースに格納されるので、読み込みのための追加の ステップは不要です。誤ったファイルパスを格納するというリスクもありま せん。 • 行を削除すると、自動的に画像も削除されます。 •
画像の変更は、コミットするまで、他のクライアントには見えません。 • トランザクションをロールバックすると、画像を以前の状態に復元できま す。 • 行の更新時は、ロックが行われます。このため、他のクライアントは同時 に同じ画像を更新できません。 • データベースのバックアップには、すべての画像が含まれます。 • SQLの権限管理によって、行と画像へのアクセスを管理できます。
34.
Oracle MySQL PostgreSQL
SQL Server BLOB型 最大4GB(9i) 最大128TB(10g) 最大64KB (※1) - - TINYBLOB型 - 最大255B - - MEDIUMBLOB型 - 最大16MB - - LONGBLOB型 - 最大4GB - - ラージオブジェクト - - 最大4GB - varbinary 型 - - - 最大2GB Image型 - - - 最大2GB Railsでカラムをbinaryで指定するとBLOB型(64KB)になる。64KB以上のオブジェクトを 保存したい場合は、limitで上限サイズを指定する。 ※1 ファイルを透過的に扱うためのデータ型としてBFILE(Oracle)やFILESTREAM(SQL Server)もある。尚、BFILEはトランザクション制御外である。 ※
35.
パフォーマンスをとるか セキュリティや整合性をとるか
36.
ぶっちゃけBLOBは扱いがめんどい
37.
LOBロケータとか 特別な機能使ったりして データ登録する必要がある。
38.
8章メタデータトリブル 8.5.2
39.
大容量メディアデータを Webサーバから クライアントに送信するのは 回避したいので サーバを分散させたい。
40.
CDP:Web Storageパターン & CDP:URL Rewritingパターン ※
但し、画像ファイルなどが第三者に参照されても問題ないか、ファイル名に連続性 がなく予測も難しい場合に限る。
41.
まとめ: データベース外部のリソースは、 データベースでは 管理できないことに注意しましょう。
42.
以上、 ご清聴ありがとうございました。
Jetzt herunterladen