App Engine Datastore - вопрос модели данных - PullRequest
0 голосов
/ 23 июля 2010

Мне нужно спроектировать модель данных для приложения, подобного Amazon S3. Давайте упростим задачу в 3 ключевых понятиях - пользователи, корзины и объекты. Есть много способов создать эту модель - я перечислю два.

  1. Три вида - Пользователь, Ведро и Объект. Каждый объект имеет Bucket в качестве родителя. Каждый Bucket имеет пользователя в качестве родителя. Пользователь - root.

  2. Динамические виды - пользователи хранятся в виде пользователя, а сегменты - в виде корзины - так же, как # 1. Однако объекты внутри корзины хранятся в динамическом виде с именем " _Object". Больше нет родительских / дочерних отношений между объектами bucket и object. Эта связь устанавливается по названию вида объекта.

# 1, конечно, более интуитивная и традиционная модель. Можно утверждать, что № 2 является радикальным, в то время как другие могут сказать, что смешно.

Почему я думаю о # 2? - В моем приложении свойства, определенные для объектов, могут варьироваться от корзины к корзине. Эти свойства указываются пользователем во время создания корзины. Кроме того, все свойства объектов должны быть доступны для запроса. Динамический тип объекта для каждой группы позволяет мне поддерживать эти требования. Более того, поскольку мой вид объекта теперь является корневым, мне больше не нужно применять фильтры предков, что означает, что я получаю индекс для каждого свойства объекта бесплатно. В модели № 1 я вынужден применять фильтры предков, что означает, что мне нужен собственный индекс для каждого свойства, к которому я хочу выполнить запрос.

Я прошу прощения за запутанное объяснение. Попробую лучше, если не понятно.

Мои вопросы - это # ​​2 совершенно возмутительная модель? С # 2 мои виды потенциально могут столкнуться с десятками тысяч. Это нормально? Я понимаю, что существует ограничение на количество пользовательских индексов. Но я не создаю пользовательские индексы для своих динамических типов, а только полагаюсь на автоматические индексы.

Спасибо, Keyur

1 Ответ

4 голосов
/ 23 июля 2010

Есть проблемы с обоими. # 1 в основном нормально, за исключением использования ссылочных свойств вместо предков и превращения типа вашего объекта в Expando.

Проблема, связанная с тем, что сегменты происходят от пользователей, а объекты - из групп, заключается в том, что все группы и объекты, создаваемые пользователем, вынуждены жить в одной и той же группе объектов . Это ограничивает производительность и масштабируемость, поскольку все данные отдельного пользователя должны храниться на одном и том же узле хранилища данных. Группы объектов полезны, когда вам нужно манипулировать несколькими объектами в одной транзакции. Если вам просто нужно смоделировать владение, используйте ReferenceProperty.

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

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

Ничто не требует, чтобы две сущности одного вида имели одинаковый набор свойств. Виды это просто имена; они не определяют и не применяют никакой схемы. Создание их на лету просто ничего вам не даст.

...