FileMakerをデータベースに採用したWebアプリケーションにおいて、大きな壁になりやすいのがCSVやXML形式でのデータインポートだ。
ほかのデータベースの場合はさほど苦労しないこの機能だが、FileMakerの場合だと残念ながら最初にいろいろ検討しなければならない箇所が出てくる。実装を急ぐことも大事だが、なにより「安定した稼働・運用にのせること」が絶対条件。実装前にかならず実現できるのかどうかを確認しておこう。
そこで、今回から2回に分けて、CSVデータをベースに一括でデータをインポートする場合に最初に考えておかなければならない点とその実装方法を紹介する。
制限ある中でどのように実装するかがカギ
すでに本コラムで何回か触れてきたとおり、FileMakerのWeb公開機能で得意としていない機能に「複数のレコードを一括で操作・更新することがむずかしい」というものがある。FileMakerスクリプトと併用すればいくつかはできるが「Web公開に対応しているスクリプトステップ」の範囲内に限られてしまう。この中に「レコードのインポート」は入っていない。
FileMaker Proが使用できる環境ならばインポート用のインタフェースを別途用意すればOKだが、Webからのインポートとなると方法は限られてくる。FileMaker Pro 10/FileMaker Server 10環境下でのインポート方法はざっと次の3とおりだろう。
- PHP側でレコードの登録・更新をCSVに格納されているデータ分繰り返す。CSVに10件データが格納されているならば-newを10回繰り返す。レコードの更新をおこないたいのならばレコードID取得のため-findを10回、レコードの更新に-editを10回おこなう
- FileMaker Serverの「スケジュール」でFileMakerスクリプトを実行する。定時になった段階で特定のテーブルに保存されているデータをもとにCSVファイルを特定し、「レコードのインポート」を実行
- FileMaker Proの「レコードのインポート」機能を使用。WebサーバにFileMaker Proクライアントをインストールしておき、任意のタイミングでPHPからFileMaker Proアプリケーションを起動。ファイルを開き「レコードのインポート」スクリプトを実行する
「レコードのインポート」スクリプトステップは、PHPから実行できる「Web公開」スクリプトとして動作しない。FileMakerスクリプトに頼ることができないため、PHP側のループでレコードを登録・更新する |
リアルタイムの処理である必要がない場合、サーバの負荷やトラブルの発生率が一番すくない2の実装方法がオススメだ。リアルタイムな処理が要求される場合は1か3の実装方法にする必要があるが、3の場合はFileMaker Proアプリケーションを起動するタイミングでトラブルが起きやすい。消去法になってしまうが、ここではもっとも原始的な方法である1の実装方法を推奨したい。
あらかじめ「できること」と「できないこと」を把握しておくこと
「PHP側でレコードの登録・更新をCSVに格納されているデータ分繰り返す」実装方法だが、これも残念ながら万能な実装方法ではない。メリットデメリットを整理してみよう。
メリット
- FileMaker Proアプリケーションが不要
- レコードの作成(-new)のみなら、複数ユーザによる同時実行も可能
- 任意のタイミングで実施できるので、リアルタイムなインポート処理が要求される場合でも対応できる
デメリット
- 複数ユーザによるレコードの更新(-edit)がある場合、複雑な排他制御を実装しなければならない (FileMakerの処理時間によるタイムラグ発生を考えると、あまり実装するべきではない)
- CSVに格納されているデータ分、ループ処理でリクエストを投げ続けるためFileMaker Serverに大きな負荷がかかる。CSVのデータが大きければ大きいほど、負荷が長くかかり続ける
紹介したメリットデメリットと、筆者の経験からできることとできないことをざっとまとめた。これからCSVデータインポートに挑むデベロッパは参考にしてほしい。
実装が可能
- CSVデータインポート機能を実施するユーザが少数(~10ユーザ以内)
- CSVデータに格納されているレコードが少数(FileMakerに作成するレコードが最大で1,000以下であることが目安)
実装は不可能、または非常にむずかしい
- CSVデータインポート機能を実施するユーザが10ユーザを超える
- 10,000レコード以上のCSVデータをWebアプリケーション側からインポートする
マスタデータといった「あまり頻繁に更新する必要がない」テーブルへの登録・更新は可能。しかしほかのシステムからFileMaker側のメインテーブルとつねに同期をとりたいといった場合、CSVファイル経由でのインポートは不向きだ。ODBCを利用するといった別の方法を検討されたい。
これらメリット・デメリット、要望されている機能の実現が可能かむずかしいかを充分に検討した上で実装に入っていこう。次回は今回取りあげた(1)と(2)のCSVインポート方法の実装方法について紹介していく。