Nano Hash - криптовалюты, майнинг, программирование

App Engine: структурированное свойство и ссылочное свойство для отношения «один ко многим»

Мой опыт проектирования хранилищ данных связан с Core Data для iOS, который поддерживает свойства, имеющие отношения «один ко многим» с другим объектом.

Я работаю над проектом App Engine, который в настоящее время имеет три типа сущностей:

  • User, который представляет человека, использующего приложение.
  • Project, представляющий проект. User может быть связан со многими проектами.
  • Post, который является основным содержанием Project. У Project может быть много сообщений.

В настоящее время User имеет свойство projects, которое представляет собой отношение "один ко многим" к Project сущностям. Project имеет свойство posts, представляющее собой отношение "один ко многим" к Post сущностям.

В этом случае, что лучше для работы — Справочное свойство хранилища данных или Структурированное свойство NDB (и чем они концептуально отличаются)? Есть ли лучший способ структурировать мои данные?


Ответы:


1

Под ссылочным свойством вы, вероятно, подразумеваете ключевое свойство. Это ссылка на другой объект хранилища данных. Он присутствует как в db, так и в ndb API. Используя их, вы можете смоделировать отношение «многие к одному», указав многим объектам ключ другого объекта.

Структурированная собственность — это совершенно другой зверь. Он позволяет вам определить структуру данных, а затем включить ее в другой объект.

Вот пример из документации, где вы указываете несколько адресов для одного контакта:

class Address(ndb.Model):
  type = ndb.StringProperty() # E.g., 'home', 'work'
  street = ndb.StringProperty()
  city = ndb.StringProperty()

class Contact(ndb.Model):
  name = ndb.StringProperty()
  addresses = ndb.StructuredProperty(Address, repeated=True)

guido = Contact(name='Guido',
                addresses=[Address(type='home',
                                   city='Amsterdam'),
                           Address(type='work',
                                   street='Spear St',
                                   city='SF')])

guido.put()

Для вашего конкретного приложения я бы рекомендовал использовать NDB (всегда лучше использовать последнюю доступную версию API) со следующим:

Модель публикации включена в модель проекта как повторяющееся структурированное свойство. Пользователи включают повторяющееся свойство KeyProperty, содержащее ключи проектов, на которые у них есть разрешения.

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

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

Дайте мне знать, если вам нужна дополнительная помощь по этому вопросу.

РЕДАКТИРОВАТЬ:

Чтобы уточнить, вот предлагаемая структура:

Модели:

  • Пользователь
  • User-Project-Mapping (необязательно, необходимо для обработки разрешений)
  • Проект
  • Почта

Пользовательская модель должна содержать User-Project-Mapping как повторяющееся структурированное свойство.

Модель проекта должна содержать Post как повторяющееся структурированное свойство.

User-Project-Mapping должен содержать только ключевую ссылку на проект и соответствующее представление разрешений.

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

28.12.2012
  • Ключевые свойства должны быть у детей, ссылаясь на их родителей? В примере адреса — это повторяющееся структурированное свойство… как этот повторяющийся характер соответствует (если есть) ключевым свойствам? Наконец, что такое фактические ключи и как их использовать (это строки, целые числа или что-то еще)? 29.12.2012
  • Ключи — это ссылки на эти объекты в хранилище данных. Предположим, что project_key содержит ключ для проекта, который вы хотите загрузить, тогда вы просто выполняете команду project = project_key.get(), и теперь нужный вам проект загружается в эту переменную. 29.12.2012
  • Спасибо за разъяснения. Я также вижу информацию о ListProperty, хотя не нахожу по ней никакой документации. Не могли бы вы объяснить это? Кроме того, хотя это может превратиться в коммерческий проект, сейчас это просто хобби, и, к сожалению, у меня нет ресурсов, чтобы кого-то нанять. Я действительно ценю всю помощь здесь, хотя! 30.12.2012
  • ListProperty — это именно то, на что это похоже — список. В API NDB его заменили повторяющиеся свойства определенного типа. Повторяющееся свойство — это список этих свойств. 30.12.2012
  • Как насчет различий в производительности загрузки? Не дорого ли будет загружать каждый адрес из ключа для каждого контакта? 31.07.2015

  • 2

    Есть еще один момент, который не был упомянут и может иметь значение: объекты, вставленные в StructuredProperty, «не являются полноценными объектами», как упоминалось в эта часть документации. Ниже приведена полная цитата (она относится к тому же примеру, что и в ответе @Sologoub):

    Хотя экземпляры Address определяются с использованием того же синтаксиса, что и для классов моделей, они не являются полноценными сущностями. У них нет собственных ключей в хранилище данных. Их нельзя получить независимо от объекта Contact, которому они принадлежат.

    Это может наложить некоторые ограничения на дизайн, учитывая, что вы не можете повторно использовать свойство объекта без дублирования данных. KeyProperty, с другой стороны, ссылается на ключ другого объекта и, следовательно, представляет отношения объектов более "реляционным" способом. И KeyProperties тоже можно повторять: просто включите параметр repeated=True.

    06.06.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..