データモデルを保存するための優れた設計を考え出そうとしています。言語はPythonですが、これはかなり不可知論者だと思います。
現時点では、3つの可能な戦略を想定しています。
オブジェクトデータベース
データモデルはオブジェクトのネットワークです。それらを作成するとき、永続オブジェクトの子孫として指定します。例:
class Tyres(PersistentObject):
def __init__(self,brand):
self._brand = brand
class Car(PersistentObject):
def __init__(self,model):
self._model = model
self._tyres = None
def addTyres(self,tyres):
self._tyres = tyres
def model(self):
return model
クライアントコードは永続性を認識せず、メモリ内にあるようにオブジェクトを操作し、永続性オブジェクトはクライアントコードが知らないうちにすべてを処理します。取得は、データベースオブジェクトのキー付きルックアップを介して実行できます。これは、(他の多くの中で)ZopeObjectDatabaseが使用するアプローチです。利点は、遅延検索であり、変更は、変更されたオブジェクトでのみ操作され、変更されていないオブジェクトは取得されません。
棚のオブジェクト
上記のデータモデルはメモリで表されますが、データベースを使用してデータをモノリティックエンティティとしてプッシュまたはプルします。例えば:
car = Car("BMW")
tyres = Tyres("Bridgestone")
car.setTyres(tyres)
db.store(car)
これは、ピクルスベースのソリューションが行うことです。これは、ある意味で前のソリューションと似ていますが、オブジェクトを単一のバンドルとして保存し、それを単一のバンドルとして再度取得する点が異なります。
ファサード
便利なメソッドを持つ単一のデータベースクラス。クライアントコードはオブジェクトを処理せず、IDのみを処理します。例
class Database:
def __init__(self):
# setup connection
def createCar(self, model):
# creates the car, returns a numeric key car_id
def createTyresForCar(self, car_id, brand):
# creates the tyres for car_id, returns a numeric id tyres_id
def getCarModel(self, car_id):
# returns the car model from the car identifier
def getTyresBrand(self, car_id, tyre_id):
# returns the tyre brand for tyres_id in car_id.
# if tyres_id is not in car_id, raises an error.
# apparently redundant but it's not guaranteed that
# tyres_id identifies uniquely the tyres in the database.
この解決策はかなり物議を醸しています。データベースクラスには多くの責任がありますが、これがSOAPで使用されている哲学であると感じています。オブジェクトを直接操作するのではなく、リモートサーバーへのオブジェクトプロパティの照会を実行します。SQLがない場合、これはリレーショナルデータベースへのインターフェイスになる可能性があります:db.createTable()
、、。SQLはこれを単純化して、言語(SQL)の解析と実行を犠牲にして、非常に単純なdbインターフェースを取得します。他の部分に触れることなく、関心のあるデータモデルのサブパートを操作することができます。db.insert()
db.select()
db.query(sql_string)
3つのデザイン、特に3つ目のデザインについてご意見をお聞かせください。良いデザインはいつですか?
逆論理
これは私がMediaWikiコードで見たものです。のようなものを持つ代わりに
db.store(obj)
彼らは持っている
obj.storeOn(db)
編集:私が示すサンプルデータモデルは少し単純です。私の本当の目的は、グラフベースのデータモデルを作成することです(誰かがプロジェクトに参加したい場合は、私は光栄に思います)。3番目のソリューションで私が心配しているのは、(メモリ内のデータモデルではなく)書き込まれたデータモデルを強力にカプセル化し、バックエンドをマスクすることですが、すべてのメソッドが公開されている中央クラスは1つしかないため、爆発するリスクがあります。正直なところ、3番目のケースは好きではありませんが、考えられる解決策として考えたので、質問の皿に載せたかったのです。そこに良いものがあるかもしれません。
編集2:反転論理エントリを追加しました