Я думаю, что MongoDB может подойти, потому что его документы облегчают представление отдельных схем.(решает проблему с переменным столбцом).
Для решения связи имеет смысл хранить только ссылки.Например, в JobPosting вы, вероятно, хотите сохранить OrganizationId
и PlaceId
, потому что это довольно сложные документы.Это также делает запрос к JobPostings определенной организации тривиальным.
Примечание Иногда встраивание может быть более подходящим, но это сильно зависит от способа обновления ваших документов.В частности, многие объекты могут ссылаться на один и тот же адрес, поэтому изменение адреса должно отражаться везде.Иногда все наоборот.Это ключевой вопрос, на который могут ответить только вы.Это зависит от того, как используется система.
В любом случае, связывание означает, что при единственном поиске может потребоваться пройти по дереву ссылок.Опять же, это сильно зависит от варианта использования:
Предположим, вы хотите отобразить JobPosting.Теперь вы можете отобразить список свойств, а для «Организация» вы печатаете только «ACME, Inc.»со ссылкой.Эта ссылка отправит вас на страницу с информацией о компании "ACME, Inc."В этом случае ваши запросы очень просты.Единственное, что вам нужно сделать, это скопировать название организации в JobPosting (ненормализация), чтобы его было проще отобразить.
Если, с другой стороны, вы хотите отобразить все на месте,вам нужно будет выполнить больше запросов и построить объект модели домена в коде.Это не имеет большого значения, но требует дополнительной осторожности в случае циклических ссылок и т. П.
Полагаю, наилучший подход - использовать соответствующий наиболее конкретный тип в качестве имени коллекции (поэтому ContactPoint заканчивается вколлекция ContactPoint, почтовый адрес в коллекции почтовых адресов и т. д.).
Единственная оставшаяся проблема - множественное наследование или миксины.Я раньше не использовал ruby, но я думаю, что драйвер mongodb ruby поддерживает миксины.
Вам все равно придется справляться с индексацией и тому подобным, но, опять же, это сильно зависит от вариантов использования.Возможно, вы захотите проиндексировать большинство внешних ключей, но для дополнительных индексов потребуется ручной уход.