0

私はプログラミングが初めてで、GAE データストアの概念を理解しようとしています。契約を簡単に書けるようにするアプリを構築しようとしています (http://contractpy.appspot.com)。知りたいのは、契約を記録するデータベースをモデル化する方法です (契約には複数の人がいる可能性があることを考慮して)トランザクションの同じ側で)?

リレーショナル モデルでは、次のことを行います。人用のテーブルを作成し、次に契約用のテーブルを作成し、その契約に参加した人を参照する 3 つ目のテーブルを作成します。次のようになります(私は推測します):

CREATE TABLE people(
 id INTEGER(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
 name VARCHAR(250) NOT NULL,     
 profession VARCHAR(30),
 driverLicense VARCHAR(12),
 address VACHAR(60) 
)ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE contracts(
idContract INTEGER(7) NOT NULL AUTO_INCREMENT PRIMARY KEY,
contractType VACHAR(12), # purchase contract, rental contract etc.
contractDate DATE,
place VACHAR(12),
)ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE contractingParties(
FK_id INTEGER(7) NOT NULL FOREIGN KEY(FK_id) references people(id),
FK_idContract INTEGER(7) NOT NULL FOREIGN KEY(FK_idContract) references contracts(idContract),    
condition VACHAR(12), # e.g., buyer, seller, renter, owner etc.
)ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;

私の質問は、GAE データストアでこれを行う最善の方法は何ですか? 以下にスケッチを書きましたが、これが GAE データストアの非リレーショナル コンセプトを使用した正しい考え方であるかどうかはわかりません。

Python 2.7 で GAE を使用しています。

ヘルプ/アドバイスをよろしくお願いします!

class People(db.Model):
    name = db.StringProperty(required = True)
    profession = db.StringProperty(required = True)
    driverLicense = db.IntegerProperty(required = True)
    address = db.PostalAdressProperty(required = True)

class Contracts(db.Model):
    idContract = db.IntegerProperty(required = True)
    contractType = db.StringProperty(required = True, choices=set(["Purchase Agreement", "Rental House", "Rental Car"]))
    contractDate =  db.DateProperty (required = True, auto_now = True, auto_now_add = True)
    place = db.StringProperty(required = True)
    parties = db.ReferenceProperty(ContractingParties, required = True)

class ContractingParties(db.Model):
    person = db.ReferenceProperty(People, required=True)
    contract = db.ReferenceProperty(Contracts, required=True)
    condition = db.StringProperty(required = False, choices=set(["buyer", "seller", "renter", "owner", "witness"]))
4

1 に答える 1

2

いくつかの考えを前もって。クラスに複数形を使用しないでください。エンティティをフェッチするとき、それは「人」ではなく、人または当事者です。また、間違った方法で参照プロパティを持っています。出発点として、以下を使用できます。

class Person(db.Model):
  name = db.StringProperty(required = True)
  profession = db.StringProperty(required = True)
  driverLicense = db.IntegerProperty(required = True)
  address = db.PostalAdressProperty(required = True)

class Contract(db.Model):
  idContract = db.IntegerProperty(required = True)
  contractType = db.StringProperty(required = True, choices=set(["Purchase Agreement",        "Rental House", "Rental Car"]))
  contractDate =  db.DateProperty (required = True, auto_now = True, auto_now_add = True)
  place = db.StringProperty(required = True)

class ContractingParty(db.Model):
  person = db.ReferenceProperty(People, required=True, collection_name="party_to_contracts")
  condition = db.StringProperty(required = False, choices=set(["buyer", "seller", "renter", "owner", "witness"]))

注意すべき点がいくつかあります。

  1. 設定可能な (外部ソースの) 契約番号が必要でない限り、Contract エンティティに idContract は必要ありません。エンティティ キーは、契約を一意に識別するのに十分です。
  2. Contract を親として ContractingParty エンティティを作成します。次に、契約に関連付けられたすべての ContractingParty エンティティは子になり、同じエンティティ グループに属します。
  3. person プロパティ ContractingParty の collection_name に注意してください。これは、人物オブジェクトを指定すると、その人物を参照するすべての ContractingParty レコードを取得できることを意味します。<someperson>.party_to_contracts.run(). 次に、ContractingParty エンティティを呼び出すことで、そのエンティティから契約を取得できますparent()。collection_name を定義しなくてもこれを行うことができますが、この場合は contractingparty_set と呼ばれます。
  4. 契約があれば、すべての関係者を取得できますContractingParty.all().ancestor(thecontract).run()

あなたのアプリケーションを完全に理解していなければ、より洗練されたモデルを直接推奨することはできませんが、これは機能し、あなたがここでやろうとしたことに基づいています.

それが役に立てば幸い。

于 2012-07-02T23:49:26.933 に答える