1

いくつかの巨大なフォームに入力するために使用されるアプリケーションを開発しています。フォームが所属できるプロジェクトがいくつかあります。また、フォームには目的や活動など、何度も入力できる 2 つのセクションがあるため、フォームには多くの目的や活動を定義できます。

プロジェクトを表すクラス、フォーム用のクラス、目的と活動を表す 2 つの単純なクラスがあります。プロジェクトにはフォームのリストがあり、フォームには活動と目的のリストがあります。

class Project(persistent.Persistent):
    forms = PersistentList() 
    ...

class Form(persistent.Persistent):
    objectives = PersistentList() 
    activities = PersistentList() 
    ...

私の質問は、このデータを次のように ZODB に保存することを計画していることです。

db['projects']   = OOBTree()
db['forms']      = OOBTree()
db['activities'] = OOBTree()
db['objectives'] = OOBTree()

project = Project(...)//fill data with some parameters
form = Form(...)//fill data with some parameters

objective1 = Objective(...)
objective2 = Objective(...)
activity1 = Activitiy(...)
activity2 = Activitiy(...)

form.addObjective(objective1)
form.addObjective(objective2)
form.addActivity(activity1)
form.addActivity(activity2)

project.addForm(form)

db['projects']['projectID'] = project
db['forms']['formID'] = form
db['activities']['activityID'] = activity1
db['activities']['activityID'] = activity2
db['objectives']['objectiveID'] = objective1
db['objectives']['objectiveID'] = ojective2

transaction.commit()

プロジェクトを保存すると、フォームのリストも保存され、フォームからの目的と活動の対応するリストも保存されることを私は知っています。

しかし、他の OOBTree、「フォーム」、「アクティビティ」、「目的」の場合はどうなるでしょうか? 個々のフォーム/目的/アクティビティを簡単にトラバースまたは検索できるようにするために、これを行っています。しかし、ZODB がこれらのオブジェクトをキャッシュし、プロジェクトを保存してそのオブジェクトへの参照を保持するときに一度だけ永続化するかどうかはわかりません。したがって、それらのいずれかが変更されると、すべての参照が更新されます。つまり、db['forms']['formID'] = form を実行すると、OOBTree はプロジェクトの OOBTree と同じオブジェクトを指すため、同じオブジェクトが 2 回保持されることはありません。それはそれが機能する方法ですか?または、永続化されたオブジェクトが複製され、すべてが独立したインスタンスになりますか?

インデックス作成などを処理するためにカタログを再配置することは知っていますが、それほど多くは必要ありません。プロジェクトを反復処理することなくフォームにアクセスできるだけです。

ありがとう!

4

1 に答える 1

3

はい、格納しているターゲット オブジェクトに、継承のどこかにサブクラス化されたクラスがある限りpersistent.Persistent、同じオブジェクトへの参照はまったく同じ (永続的な) オブジェクトを指します。これについて説明したように、重複を期待しないでください。

短い長いバージョン: ZODB は特別なピクル手法を使用します。ソース/参照オブジェクトをシリアル化するときに、参照が永続オブジェクトへのものであることを認識し、そのオブジェクトを再度格納する代わりに、クラスのドット名のタプルを格納します。ターゲット オブジェクトの内部 OID。

警告: これは同じオブジェクト データベース内でのみ機能します。アプリケーションでデータベース間の参照を行うべきではありません。

于 2013-10-21T04:39:53.340 に答える