4D v13 では各 BLOB、ピクチャー、テキストフィールドごとにデータの保存先を指定できます。既存の保存オプション ( レコード内、またはレコード外 ) に加え、データファイル外への保存を選択できます。この場合データはディスク上の外部ファイルとして保存されます。外部ファイルはサードパーティアプリケーションで変更することができますが、この場合データ整合性は開発者が管理しなければなりません。
この動作はユーザーに対し透過的です。データの場所に関わらず、データへのアクセスは同じです。
ファイルの外に保存できることで、アプリケーションの動作を最適化することができます。例えば大量のデータを外部に保存できればその分データファイルのサイズを減らすことができます。またデータベースが開かれていないときでも OS からそれらのファイルにアクセスすることができます。
データファイル外部への保存は 2 つのモードで実行できます :
- 自動モード : このモードでは、4D は特定の構造のフォルダーを自動で作成・管理し、すべてのデータをそこに格納します。この場合データは透過的に管理され、フィールドデータがデータファイル内部に格納された
場合と同様に動作します。
この自動モードを有効にするには以下のいずれかの方法を取ります :
- カスタムモード: このモードでは各フィールドおよび各レコードごと、外部ファイルの保存場所を自由に選択できます。この場合 4D はフィールドとデータの間のリレーションのみを管理し、データベースメカニズムの一部は動作しなくなります。
カスタムモードはSET EXTERNAL DATA PATHコマンドを使用して、path引数にデフォルト以外のフォルダーを指定することで有効にされます。
以下の表では自動およびカスタムモードの機能を比較します:
| 自動モード | カスタムモード |
格納先フォルダーの設定 | 名前と場所は 4D が設定します。データベース全体で 1 つのデフォルトフォルダーを使用します。 | 名前と場所を自由に設定可能。各フィールドごとに変えることもできます。 |
外部ファイルの作成、ロード、保存 | 自動 | 自動 |
レコードが削除された際の外部ファイルの削除 | はい | いいえ |
フィールドに NULL 値が割り当てられたときの外部ファイルの削除 | Yes | いいえ |
データベースが保存された際の自動統合 | はい | いいえ |
ログファイル統合の際の自動サポート | はい | いいえ |
標準インデックスのサポート (テキストフィールド) | いいえ | いいえ |
キーワードインデックスのサポート (テキストとピクチャー) | はい | いいえ |
トランザクションのサポート | はい | いいえ |
データファイルの外に保存されたデータは以下の原則に基づき整理されます:
- 各レコードごと、データは xxx.txt ( テキスト )、xxx.blob (BLOB)、xxx.jpgや xxx.tiff ( ピクチャー、拡張子はピクチャータイプに基づく ) という名前で保存されます。xxx は 4D が管理する UUID です。
- 自動モードでは、すべての外部データが <DatabaseName>.ExternalDataという名前のフォルダーに配置されます (DatabaseName はデータベースストラクチャーの名前です )。このフォルダーはデータファイル (.4DD) と同階層に作成されます。
4D はこのフォルダー内に、外部にデータを格納するフィールドを持つテーブルごとにフォルダーを作成し ( 名前は "Table"+ テーブル番号 )、さらに各外部フィールドごとにサブフォルダーを作成します (名前は"Field"+ フィールド番号)。フィールド中の最初の 100 項目はフォルダーの第一レベルに格納されます。それ以降は "2" から始まるサブフォルダーが順次作成され、その中に 100 要素までが格納されます。例えば"Accounting" データベースのテーブル番号 3 のフィールド番号 5 のデータがデータファイルの外に格納される場合、以下の構成でフォルダーやファイルが 4D により作成されます:
Accounting.4DD
[Accounting.ExternalData]
Table3
Field 5
Data_1B7F3A 56F6544B45951EFA60426D5ABC.txt
Data_1B7F3A 56F6544B45951EFA60426D5CCC.txt
...
2
Data_2ADBFBA478AAE4409DA9C2D13C90A53B.txt
Data_32F8A30B87EE7E4BBC802468D553DC43.txt
...
フィールドの外部ファイルへの記録は、レコードがディスクに保存される際に行われます (必要であればトランザクションが有効にされた後):
- 外部ファイルが存在しなければ作成されます。
- 外部ファイルが既に存在する場合、4D はそれを新しいファイルで置き換えます。
既存のファイルを保持したい場合、(SET EXTERNAL DATA PATHコマンドを使用して ) 異なるパスを指定するか、レコード保存前に既存の外部ファイルからその内容をメモリにロードするためにRELOAD EXTERNAL DATAコマンドを使用します。この方法はレコードがロードされた後、外部ファイルが他のアプリケーションによって変更された場合にも有効です。
データの格納場所は各データベースごとのローカルパラメーターです。データの同期や複製を行う場合、 これらのパラメーターはローカルデータベースとリモートのそれとでは異なるかもしれません。 この場合データの格納は各データベースのパラメーターに従います。 同期や複製は設定を変更しません。
例えばリモートデータベースにおいてピクチャーフィールドが外部ファイルとして保存され、同じフィールドがローカルデータベースではデータファイル内に保存されている場合、複製が行われると、ローカルデータベースのこのフィールドに追加されたすべての (データファイル内の) データは、リモートデータベースのデータファイル外に保存されます。
外部に格納されたファイルは 4D 以外のアプリケーション (OS、テキストやグラフィックエディター等 ) から読み書きモードでアクセスできます。しかしこれはアプリケーションの動作を変更してしまうかもしれないので、注意して行わなければなりません:
- 外部ファイルが OS やその他のアプリケーションによって削除、名称変更、あるいは移動されると、4D は対応するフィールドが NULL 値を持つものとして扱い、レコードが保存されるときに ( 値が NULL でなければ ) 新しいファイルが作成されます。
- インデックスを使用している場合、サードパーティアプリケーションが外部ファイルを変更しても、親レコードがディスクに保存されるまでは、インデックスが更新されません。
注: 外部テキストファイルは BOM なしの UTF-8 で保存されます。サードパーティアプリケーションでそのファイルを開き、BOM 付きで保存された場合、そのファイルを 4D で開くことはできますが、保存の際に BOMは失われます。
"読み込みのみ" モードでレコードをロードしても、このレコードの対象フィールドの外部ファイルはロックされません。ディスクファイルはその内容が 4D のメモリに読み込まれていますが、4D やその他のアプリケーションを使用して編集が可能です。