RDBに画像を保存するメリットデメリットをキャッキャウフフしました
teratailのイベントに参加したくて登録したら
答えられそうな内容があったので答えて見たら
すごく盛り上がったのでまとめておきます
回答してみたのだけど、読み込み(表示)性能向上方法はあると思うのですが、書き込みや保守性可用性運用性考えると、DBに画像を保存するメリットがいまいち想像できなかったです。 teratail.com/questions/81233
2017-06-21 15:56:10親方が反応
シュッと本質を突いてくださる
@mamy1326 「Webサーバを分散させた時」にどうする? って観点くらいかなぁ。 その辺から、おいちゃんはわりと「localにファイルを置くのを好まない」傾向は、あるかなぁ。
2017-06-21 16:59:53@gallu そうなんですよねー。rsyncでいいじゃんって場合とそうでない場合ありますし。できれば1箇所にしたい。ひと昔前だと「サブドメ切って別サーバー」って案もあったと思うんですけど、今はどうなんでしょ?
2017-06-21 17:19:39@mamy1326 「画像の更新者及び更新頻度」による、んだろうなぁ。 なので、その結果としての「画像をDBで)は、選択肢としては「ありえる」って、おいちゃんは考えるかなぁ。
2017-06-21 17:22:42@gallu 一回入れたならそうそう更新しない、のなら、子テーブルもありなんですかね。僕のコメントに回答くださった方で「電子カルテの付加情報」としてセキュアに扱う画像データがあるというお話が聞けましたし。根拠が倫理的で、先々の設計が妥当ならOK、と言うところなのかなあ、と。
2017-06-21 18:06:20KVSやドキュメントDBの知見がまるでない自分に気づく…
課題があるのは楽しみの一つ!
そしてブリンガーさんの発言を見落としていたことにここで気づく…
@mamy1326 KVS、ドキュメントDBに入れますよね。普通 バックアップの容易さ、一貫性(お金をもらって画像を預かる)、LAMPで組むしかエンジニアができないしか考えられないっすねー。
2017-06-21 16:06:20yokuさんのトランザクションのご利益から話は発展し…
@mamy1326 アップロードが成功した画像が消えることは許されない、のであれば、トランザクションのご利益があるかもしれません。。
2017-06-21 17:46:52@yoku0825 なるほど。裏を返すと、Webサーバーで受信し切った後は、Webサーバー側で消えないように実装すればいいし、それは基本的にはWebサーバーもしくはストレージの役割だよね、ってことになるかなって思ってます。やっぱりメリット薄いですねー。
2017-06-21 18:02:15@soudai1025 @mamy1326 @yoku0825 バックアップ対象がデータベースに集約される(オリジナル画像がDBにある安心さ)という視点で実装したことがあります。必要に応じてキャッシュ的に画像を展開配置することでDB側の画像は参照しないとかできますし。DBはSPOFのままですが、Webサーバは画像のことを考えずにスケールとか。
2017-06-21 18:14:57@k1LoW @mamy1326 @yoku0825 僕は暗号化とセキュリティの観点でDBに入れたことがあります(PostgreSQLの暗号化拡張を使った)入れたの正確には見積書とかのPDFでしたけど。
2017-06-21 18:31:53@soudai1025 @k1LoW @yoku0825 「特殊な文書」を除けばDB保存する理由は見当たらない、と言うことになるんですかね。S3とnginxがでた時点で、静的ファイルはサブドメ切ってそっちへ、って流れになったかな、と。
2017-06-21 20:52:39@mamy1326 @soudai1025 @yoku0825 Webサーバをイミュータブルにしようとしたときに、Webサーバをユーザがアップロードするデータの保管場所にしたくない=今ならS3が選択肢にある となると、特殊文書だけしか今は思いつかないですね(むしろ暗号化の観点で保存は思いつかなかった
2017-06-21 20:56:33@k1LoW @soudai1025 @yoku0825 暗号化とセキュリティとなると用途はありそうだな、とは思いました。teratailでコメントくださった方も「暗号化とセキュリティの観点で電子カルテに添付される諸々のスキャン画像」が対象だったとおっしゃってました。 S3がない時代にこの手の問題をどうするかは未考慮だったりします。
2017-06-21 21:13:39@mamy1326 @k1LoW @yoku0825 ファイル共有とか共有ストレージとかrsyncとか色々やり方はあるとは思いますが前レス踏まえて大体そんな感じです。まぁs3fsとかも辛いときはつらいですけど。あとPostgreSQLにはラージオブジェクトって便利なやつがある。lets.postgresql.jp/documents/tech…
2017-06-21 21:17:41@soudai1025 @k1LoW @yoku0825 ラージオブジェクトってMySQLでいうBLOBのことですかね。Barracuda使えば圧縮もできる…けどバッファプールと相談なのかなこれ。近年のPostgreSQLもMySQLも機能的に並んでる印象です!
2017-06-21 21:50:45kamipoさんの記事を紹介してくれるとみたさん
@mamy1326 @soudai1025 @k1LoW @yoku0825 ”サイズの大きい可変長カラムをクラスタインデックスから追い出して行のサイズを小さく保てるということは、ページあたりより多くの行を詰め込めるようになるということで、バッファプールにより多くの行を乗せられるようになる" らしいです blog.kamipo.net/entry/2014/12/…
2017-06-21 22:03:59BarracudaとAntelopeの違いを認識する僕
@tmtms @soudai1025 @k1LoW @yoku0825 ありがとうございます!なるほど公式にもそう書いてありました!今5.7の検証してるんですが、my.cnfの設定、デフォルト値など含め、Barracudaって実際どうなってるの?と言うのを熟読します!
2017-06-21 23:48:09