-2

У меня есть четыре основных вида: учетная запись, компания, сервис и адрес. Я хотел бы, чтобы объекты Адреса были разделены между компаниями и организациями Сервиса.Сложные, дорогостоящие ссылки на многие лица для многих

  • счет: это учетная запись пользователя (адрес электронной почты, пароль)
  • Компании: Бизнес, которые предоставляют услуги (предок: 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 , иначе они останутся сиротами. Дополнительные запросы по-прежнему требуются при просмотре страниц. Это тоже кажется дорогим.

Это два подхода, с которыми я столкнулся; они оба кажутся плохими. Любые идеи о том, как я могу улучшить это?

+0

Почему бы не совместить компанию, услугу и адрес в одном объекте. – voscausa

+1

Сделайте это правильно (нормализованный), затем проверьте его. Если вы только заботитесь о производительности, напишите все в сборке –

+0

Компании и службы звучат как подклассы некоторого суперкласса для меня. Но я не могу придумать имя для этого суперкласса. Если вы думаете об одном, отредактируйте свой вопрос соответствующим образом. –

ответ

0

Это довольно стандартная проблема с хранилищем данных. Решение является денормализацией. Предоставляя дубликаты, вы можете разбить проблему на отношения «один ко многим». Итак, в вашем примере: Разрешите Address дубликатов и пусть каждый Address имеет родителя, либо Company, либо Service. Или разделите объект Address на два (ServiceAddress, CompanyAddress).

Когда вы сейчас изменяете Service или Company, вы можете сделать простой запрос предка для адресов, и вы получите только соответствующие адреса.

Этот подход предполагает, что вы не будете обновлять Address (или любой другой объект, который у вас есть) более одного раза в секунду, поскольку в противном случае вы будете запускать 1 запись в секунду и группу объектов.

+0

Нет абсолютно никакой причины создавать повторяющиеся объекты адреса. –

+0

в зависимости от требований согласованности. Я предпочел бы предков перед списками ключей или идентификаторов, но это только мое мнение. – konqi

+0

Ребята - хороший вариант, когда ребенок всегда принадлежит одному из родителей, что здесь не так. Вы должны очень тщательно дублировать данные, потому что вы создаете сложную логику (не забудьте отредактировать/удалить в обоих местах и ​​т. Д.). В этом конкретном случае это совершенно не нужно. –

1

Если вы храните ключи адресов в моделях вашей компании и Сервиса, вам не нужны «дополнительные запросы для их получения» - вы можете просто get получить все необходимые объекты адреса. Это быстро и дешево.

+0

Не так уверен в «быстром и дешевом» этом решении. Если вы получите сущность по ключу, это все равно будет чтение/запрос хранилища данных. Если вам требуется несколько (или всех) адресов, вам потребуется несколько ключевых запросов вместо одного запроса фильтра. – konqi

+3

(a) Вам не нужны никакие запросы, когда у вас есть ключи. (b) 1 чтение на объект является минимально возможной стоимостью для извлечения данных. Каждое другое решение будет стоить дороже. –

Смежные вопросы