私はCouchDBを初めて使用し、それについて学びます。参照整合性に対するCouchDBのサポートに出くわしませんでした。CouchDBドキュメントのフィールドに外部キーを作成できますか?
たとえば、注文書で使用されているベンダー名がベンダーデータベースで利用可能であることを確認することは可能ですか?
CouchDBは参照整合性をサポートしていますか?また、ドキュメント内のフィールドを主キーとして作成することは可能ですか?
私はCouchDBを初めて使用し、それについて学びます。参照整合性に対するCouchDBのサポートに出くわしませんでした。CouchDBドキュメントのフィールドに外部キーを作成できますか?
たとえば、注文書で使用されているベンダー名がベンダーデータベースで利用可能であることを確認することは可能ですか?
CouchDBは参照整合性をサポートしていますか?また、ドキュメント内のフィールドを主キーとして作成することは可能ですか?
いいえ、CouchDB は外部キー自体を処理しないため、システムの参照整合性を処理させることはできません。アプリケーション レベルでベンダーのチェックを処理する必要があります。
フィールドを主キーにできるかどうかについては、主キーは _id フィールドですが、db 上のビューのキーとして任意の有効な json を使用できます。したがって、たとえば、ベンダーをキーとして注文のビューを作成できます。
何かのようなもの
function(doc) {
if (doc.type == 'order')
emit(doc.vendor,doc);
}
値 order を持つ type 属性を持つデータベース内のすべてのドキュメントを取得し、ベンダーをキーとして使用してそれらをビューに追加します。
これらの質問は、非常にリレーショナル データベース固有のものです。
CouchDB やその他の非 RDBMS では、RDBMS の場合と同じ方法でデータを保存しないため、この方法で関係を設計することは最善ではない可能性があります。しかし、これを行う方法を理解するために、あるベンダーのドキュメントと、そのベンダーのドキュメントに「関連付ける」必要がある一連の注文用のドキュメントがあると仮定します。
主キーはなく、ドキュメントには uuid である _id があります。ベンダー向けのドキュメントがあり、注文などのために新しいドキュメントを作成している場合は、ベンダー ドキュメントの _id を参照できます。
{"type":"order","vendor-id":"asd7d7f6ds76f7d7s"}
特定のベンダーのすべての注文を検索するには、次のようなマップ ビューを表示します。
function(doc) { if (doc.type == 'order') {emit(doc['vendor-id'], doc)}}
ドキュメント _id は変更されないため、名前や請求情報などのベンダー ドキュメントの他の属性を変更しても、そこには「整合性」があります。仕入先ドキュメントの仕入先名またはその他の属性を注文ドキュメントに直接貼り付ける場合、それらを一括で変更したい場合は、スクリプトを記述する必要があります。
それが少し役立つことを願っています。
FK 制約を作成することはできませんが、Couch のValidate
関数を使用すると可能です。
function(newDoc, oldDoc, userCtx, secObj) {
if(newDoc && newDoc.type) switch(newDoc.type){
case 'fish':
var allSpecies = ['trout','goldfish'];
if(!allSpecies.contains(newDoc.species)){
throw({forbidden : 'fish must be of a know species'});
}
break;
case 'mammals':
if(!['M','F'].contains(newDoc.sex)){
throw({forbidden : 'mammals must have their sex listed'});
}
break;
}
}
さて、ある人が本当に頭のいい人なら (私はそうではありません)、種のリストを得るために DB 自体を呼び出すかもしれません... それは外部キーになります。
次の記事もお読みください: How do I DRY up my CouchDB views?