2013-03-20 5 views
8

Я не могу найти ни одного сообщения в блоге или документации, говорящей об этом. Они, как встроенный документ, так и хэш-тип данных, весьма схожи. Какая польза или ограничение каждого из них?встроенный документ против хеш-типа в mongoid

Рассмотрим мой дизайн схемы:

class HistoryTracker 
    include ::Mongoid::Document 
    include ::Mongoid::Timestamps 

    field :modifier,   type: Hash, default: {} 
    field :original,   type: Hash, default: {} 
    field :modified,   type: Hash, default: {} 
    field :changeset,   type: Hash, default: {} 
end 

Должен ли я создать несколько внедренный документ внутри этого HistoryTracker класса? или просто использовать это? Как насчет индексации?

+0

Что вы подразумеваете под «хешем» типа данных? –

+0

Я имею в виду 'field: modifier, type: Hash'. – Chamnap

ответ

6

Монгоид хранит встроенные документы и атрибуты хеширования примерно так же на уровне базы данных. Это нормально при работе с mongoid, чтобы объявлять ваши поля в ваших моделях, поэтому, если у вас есть вложенная структура, она нормальна для создания встроенного документа. Поскольку MongoDB не является монгодом без схемы, вам нужно объявить поля, чтобы представить их в том же API, что и ActiveRecord. Но для некоторых случаев использования атрибут Hash дает вам немного большую гибкость. Недостатком этой гибкости является то, что вы ограничены Hash API, поэтому вы не получаете автоматические методы атрибутов, и вы не можете инкапсулировать бизнес-логику так, как это обычно бывает в классе модели.

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

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

1

С внедренного документом вы также имеете псевдонимы атрибутов, как в

class Outer 
    include Mongoid::Document 

    embeds_one :inner_informative_object_with_long_name, store_as: :inn 
end 

class Embedded 
    include Mongoid::Document 

    attribute :vvla, as: :very_very_long_attribute, type: String 
end 

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

0

Проблемы я столкнулся с использованием хэш вместо встроенных документов

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

, так что если вы хотите, чтобы иметь «Hash дамп», как в следующем

class Event 
    include Mongoid::Document 
    field :properties, type: Hash 
end 

Тогда вы не можете использовать объекты в свойствах

class Foo 
    include Mongoid::DOcument 
end 

e = Event.new(
    properties: { 
    some_info: Foo.new 
    } 
} 

Попытка сохраняться следующее событие вызовет сбой потому что Foo не будет сериализован (попробуйте e.as_document, и вы увидите, что значение some_info не будет сериализовано)

ссылки на выпуски: Github, MongoDB tracker

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