質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.07%

DB以外のトランザクション的処理

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,028

chida_455

score 6

 前提・実現したいこと

あるサイトをクローリング・スクレイピングするのに、画像とその関連する内容を取得して、ストレージもしくはデータベースに保存したいとする。

このとき、テキストデータはデータベースに挿入すればいいが、
それと関係する画像はblob型で同じデータベースのレコードに挿入するべきか、それとも、
データベースにpath付きカラムを追加して、画像などの外部ファイルはストレージに別途保存するべきか、
という2つのパターンがある。
そして、これは外部ファイルとデータベースのレコードの内容がトランザクション的に処理されるかどうか悩ましい問題であり、
同時に、テキスト以外のデータをクローリングするときの共通問題である。

ここに、すでにいくつか文献を上げると、

「blob型でデータベースにファイルを保存する場合の注意点」として、

https://teratail.com/questions/81233
https://qiita.com/kzhr/items/aaad744f8e06abc16949
http://bluerabbit.hatenablog.com/entry/2015/03/29/214639

があり、
一方、外部ファイルをデータベースに挿入しない方法としては、
プログラム側でトランザクション的なファイル操作を実装する方法で、

https://colo-ri.jp/develop/2010/03/mysql.html
http://blog.flup.jp/2008/02/18/work_together_with_transaction_and_file_operation2/

のようです。そして、どちらの方法を取るべきかは要件と自分の能力次第ですが、
自分の能力として、今後、画像をデータベースとは独立して使う可能性もあるし、
一方で、データベースに突っ込んだままの方がよい可能性もあるしで、
正直判断がついていません。

そうなれば、将来的にデータベース負荷の大きくなりそうな、画像をデータベースのレコードに挿入する方法をやらない場合、
自分でプログラミング上でトランザクション的なファイル処理を実装する必要があります。
しかし、文献ほどのスキルはありません。
一方で、python3を使用しており、それ用のライブラリがあるか探したところ、

https://transaction.readthedocs.io/en/latest/
https://github.com/nilp0inter/acidfile

が見つかりました。

そして、そもそも、データベースにおけるトランザクションとはどのように実装されているのかを調べると、(wal機能)「write ahead log」という機能により、万一、停電などにより異常終了しても、ログに書き出されたら、次回は必ずクエリが実行されて更新処理が正常に行われるようです。
これをプログラミング上で実装する必要があります。

要するに、データベースに画像を挿入しないなら、wal機能を自力で実装すればいい話ですが、そう簡単ではない事は明白であり(それは既存のDBソフトを開発する事になるから)、そのような事をファイル操作で実現する方法やツールを知っていましたら、
教えてください。

逆に、データベースに画像を挿入する方法を選ぶ場合、どれくらいの画像データや1テーブルあたりのレコード数、並びにアクセス頻度なら、実用的で重い処理にならないと判断できますでしょうか?

 補足情報(FW/ツールのバージョンなど)

python3

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

一般的なデータベースにはトランザクションが大事ですが、今やろうとしているスクレイピングした内容にそれほどの機能が必要でしょうか?

多めに書き込んでしまうと整合性に苦労しますが、不測の事態にはデータを落としてしまえば良いように思いました。

データベースへの書き込みを緻密に処理するより、スクレイピングを再度実施したほうが実装的には簡単になります。 

トランザクション処理するコードを自分で書きたいという目的であれば、この回答ではお役に立てませんが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る