Как смоделировать базу данных контрактов (с несколькими покупателями или продавцами) с использованием хранилища данных GAE

Я новичок в программировании и пытаюсь понять концепцию хранилища данных GAE. Я пытаюсь создать приложение, чтобы упростить запись контрактов (http://contractpy.appspot.com), и я хотел бы знать: как смоделировать базу данных для записи контрактов (учитывая, что контракт может иметь несколько человек на одной стороне сделки)?

В реляционной модели я бы сделал следующее: создал таблицу для людей, затем таблицу для контракта и третью таблицу со ссылкой на людей, которые участвовали в этом контракте. Это выглядело бы примерно так (я полагаю):

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.

Я использую GAE с Python 2.7.

Заранее благодарим за любую помощь / совет!

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"]))

person craftApprentice    schedule 02.07.2012    source источник


Ответы (1)


Просто некоторые мысли заранее. Не используйте множественное число для ваших классов. Когда вы получаете объект, это не "Люди", а Человек или Партия. У вас также есть ваши ссылочные свойства неправильным образом. В качестве отправной точки вы можете использовать следующее.

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. Вам не нужен idContract в объекте Contract, если вам не нужен настраиваемый (полученный из внешнего источника) номер контракта. Ключа сущностей будет достаточно, чтобы однозначно идентифицировать контракт.
  2. Создайте сущности ContractingParty с Контрактом в качестве родительского элемента. Тогда все сущности ContractingParty, связанные с контрактом, будут дочерними и принадлежат к той же группе сущностей.
  3. Обратите внимание на collection_name в свойстве человека ContractingParty. Это означает, что для объекта person вы можете получить все записи ContractingParty, которые относятся к этому человеку. <someperson>.party_to_contracts.run(). Затем вы можете получить контракт от объекта ContractingParty, вызвав для него parent(). Вы все еще можете сделать это без определения collection_name, но в этом случае это будет называться contractingparty_set.
  4. Имея контракт, вы можете получить все стороны с помощью ContractingParty.all().ancestor(thecontract).run()

Без полного понимания вашего приложения я не могу напрямую рекомендовать более совершенную модель, но она будет работать и основана на ваших действиях, которые вы здесь пытались сделать.

Надеюсь, поможет.

person Tim Hoffman    schedule 02.07.2012