Использовать дополнительные ключи или универсальный ключ в MongoMapper?
Предположим, я работаю над классом MongoMapper, который выглядит следующим образом:
class Animal
include MongoMapper::Document
key :type, String, :required => true
key :color, String
key :feet, Integer
end
Теперь я хочу хранить размах крыльев птицы. Было бы лучше добавить это, хотя это не имеет значения для многих документов и выглядит немного неопрятно:
key :wingspan, Float
Или это, несмотря на то, что это неописуемое всеохватывающее чувство, похожее на взлом:
key :metadata, Hash
Похоже, что подход: метаданные (для которого есть прецедент в коде, который я наследую) почти избыточен для документа Mongo в целом: оба они предназначены для использования без схем в виде пар ключ-значение.
Однако, также кажется, что добавление специфичных для животного ключей - скользкий путь к довольно уродливой модели.
Любые альтернативы (создать подкласс Bird)?
2 ответа
MongoMapper не хранит ключи, которые nil
так что если вы определили key :wingspan
только документы, которые фактически устанавливают этот ключ, будут хранить его.
Если вы решите не определять ключ, вы все равно можете установить / получить его с помощью my_bird[:wingspan] = 23
, (The []
вызов фактически автоматически определит для вас ключ; Точно так же, если документ возвращается из MongoDB с ключом, который явно не определен, для него и всех документов этого класса будет определен ключ - это своего рода ошибка, чтобы определить его для всего класса, но так как nil
ключи не хранятся, это не такая большая проблема.)
Если у птицы тоже есть свое поведение (вероятно, оно есть), то подкласс имеет смысл. Для птиц и животных я бы выбрал этот путь, так как каждая птица - животное. MongoDB намного лучше, чем ActiveRecord для наследования одной таблицы/ одной коллекции, потому что вам не требуется миллиард миграций, и ваш код проясняет, какие атрибуты соответствуют каким классам.
Трудно дать хороший ответ, не зная, как вы собираетесь расширять базу данных в будущем и как вы собираетесь использовать информацию, которую вы храните. Если вы храните большое количество птиц и хотите подвести итоги по размаху крыльев, то размах крыльев будет полезен, даже если он не будет использоваться для других животных. Если вы планируете хранить произвольную произвольную информацию для каждого известного животного, существует слишком много возможностей для отслеживания в схеме, и подход на основе метаданных будет более удобным.