У меня есть четыре основных вида: учетная запись, компания, сервис и адрес. Я хотел бы, чтобы объекты Адреса были разделены между компаниями и организациями Сервиса.Сложные, дорогостоящие ссылки на многие лица для многих
- счет: это учетная запись пользователя (адрес электронной почты, пароль)
- Компании: Бизнес, которые предоставляют услуги (предок: Account)
- службы: услуга, оказываемая компания (предок: Company)
- адрес: адрес (группа полей: улица, город, страна) компании или службы (предок: Account)
Задача: Компании и службы могут иметь разные адреса; в конце концов, адрес компании не обязательно там, где его услуги приобретаются. У служб может быть много адресов, поскольку компания может создавать различные франшизы/торговые точки, где могут быть приобретены ее услуги.
Я хотел бы моделировать данные таким образом, чтобы на Адреса можно было ссылаться как на компании, так и на объекты службы или на то и другое. Я пробовал эти два подхода:
Давайте предположим, что это адрес модель:
class Address(ndb.Model):
street = ndb.StringProperty(required=True)
city = ndb.StringProperty(required=True)
country = ndb.StringProperty(required=True)
подход 1: список Магазин адресных ключей внутри службы или компании
class Service(ndb.Model):
title = ndb.StringProperty(required=True)
addresses = ndb.KeyProperty(repeated=True)
class Company(ndb.Model):
name = ndb.StringProperty(required=True)
addresses = ndb.KeyProperty(repeated=True)
Проблема: Для каждый просмотр страницы Сервиса или Компании, мне нужно будет выполнить дополнительные запросы для извлечения их соответствующих адресов. Это взрывается, чтобы стать большой дорогостоящей проблемой, поскольку число наших организаций растет.
подход 2: Создать объект AddressMapping, который формирует отношения между двумя субъектами:
class Service(ndb.Model):
title = ndb.StringProperty(required=True)
addresses = ndb.KeyProperty(repeated=True)
class AddressMapping(ndb.Model):
entity = ndb.StringProperty(required=True) # service or company
address = ndb.KeyProperty(repeated=True)
Проблема: Если служба отключена/удалены/изменены, необходимо удалить/изменить все сопутствующие объекты AddressMapping , иначе они останутся сиротами. Дополнительные запросы по-прежнему требуются при просмотре страниц. Это тоже кажется дорогим.
Это два подхода, с которыми я столкнулся; они оба кажутся плохими. Любые идеи о том, как я могу улучшить это?
Почему бы не совместить компанию, услугу и адрес в одном объекте. – voscausa
Сделайте это правильно (нормализованный), затем проверьте его. Если вы только заботитесь о производительности, напишите все в сборке –
Компании и службы звучат как подклассы некоторого суперкласса для меня. Но я не могу придумать имя для этого суперкласса. Если вы думаете об одном, отредактируйте свой вопрос соответствующим образом. –