Couchbase - получить атрибут документа, на который ссылается идентификатор

У меня есть документ «продукт», который имеет атрибут «categoryId» для ссылки на документ «категория». Когда я получаю продукт, я хотел бы иметь возможность получить название категории, а не только идентификатор. Я знаю, что мне нужно создать представление для этого, но я новичок в Couchbase, и я искал в Google, но не смог найти, как именно это сделать.

это будет документ продукта

{
    "id": 1,
    "name": "Guitar",
    "categoryId": 5,
    "jsonType": "product",
    ... (other fields)
}

И это будет документ категории

{
     "id": 5,
     "name": "Musical Instruments",
     "description": "",
     "jsonType": "category"
}

Спасибо!


person damian    schedule 16.10.2014    source источник
comment
Не могли бы вы предоставить дополнительные спецификации - например. сколько записей вы ожидаете вернуть за один вызов, как CB вписывается в вашу архитектуру, сколько объектов в вашей базе данных и т. д.   -  person theMayer    schedule 22.10.2014
comment
Обычно я показываю список продуктов (последние на главной странице или результаты пользовательского поиска). Вот почему название продукта и категории должно быть в одном документе/представлении. Я использую elasticsearch для поиска и предоставления идентификаторов документов, а затем CB считывает эти идентификаторы. Это новый веб-сайт, который я разрабатываю, поэтому пока очень мало объектов. как только он выйдет в эфир, он не будет очень большим, может быть, 1.000 записей?   -  person damian    schedule 24.10.2014
comment
Мой совет - выбирайте один из двух. Либо используйте весь Elasticsearch, либо весь Couchbase. Вам может показаться, что Elasticsearch проще запустить для небольшой установки.   -  person theMayer    schedule 25.10.2014


Ответы (2)


Я не знаю всех ваших шаблонов доступа к этим данным, но если этот конкретный критичен, почему бы просто не указать название категории в документе о продукте? а для ключа имен категорий, если вам нужно получить этот конкретный объект, сделайте его чем-то значимым. Это также не сильно увеличит размер документа. В Couchbase ключ объекта может иметь длину 250 байт, поэтому используйте их для создания ключа, который ваше приложение может создать из имеющейся у него информации. Например, ключом для вашего документа категории выше будет "category::Musical-Instruments". Затем, если ваш документ о продукте имеет это встроенное, он может быстро получить информацию об этой категории по ключу, или, если вам просто нужно полное имя категории, ваше приложение отрезает категорию:: и заменяет - пробелом . или как вы хотите это сделать.

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

Таким образом, «id»: 5 допустимо, но Couchbase предоставляет способы сделать вещи значимыми для вашего приложения и может обеспечить сверхбыстрый поиск даже в масштабе. Это путь, по которому я бы пошел более чем вероятно, и я бы порекомендовал вам подумать, чтобы в конечном итоге решить вашу проблему. Я бы порекомендовал прочитать эту запись в блоге для получения дополнительной информации об этом.

person Kirk    schedule 23.10.2014
comment
Привет @Kirk, я думал об этом, но что, если название категории изменится? идентификатор не может быть изменен, поэтому необходимо удалить категорию и создать новую. также категории представляют собой дерево, я использую материализованный путь. поэтому мне пришлось бы обновлять все продукты, принадлежащие к этой категории и всем подкатегориям. Я не думаю, что это будет происходить часто, поэтому, если нет другого пути, я думаю, мне придется это сделать... - person damian; 24.10.2014
comment
Если бы это был я, я бы сказал, что нужно решить +95% варианта использования и спланировать 5% или меньше пограничных случаев. Если вы так редко меняете названия категорий, возможно, стоит вставить название, как у меня. Или вы можете потратить огромное количество времени на кодирование этого случая, который может никогда не произойти. Затем вы создаете задокументированный процесс/план того, как поступать с теми очень редкими крайними случаями, когда вы хотите изменить название категории. Кроме того, я не говорю, что нет другого способа сделать это. Я просто говорю, как бы я решил это, учитывая то, что вы нам сказали. - person Kirk; 24.10.2014

Здесь вы пытаетесь создать внутреннее соединение на Couchbase. Теперь в вашем вопросе точно не указан выходной формат для ваших данных, но, на мой взгляд, здесь есть небольшой конфликт дизайна. Базы данных документов действительно работают лучше всего, когда все вещи, которые вы хотите собрать, находятся в одном документе. По сути, это выглядит как реляционный дизайн, помещенный в нереляционную базу данных — так сказать, квадратный колышек в круглой дыре.

При этом я бы исследовал использование запроса N1QL («никель») для достижения этой цели. Хотя я еще не использовал инструмент N1QL (потому что я разработал свою базу данных, не требующую объединений и т. д.), он подает надежды, особенно для небольших наборов данных. http://docs.couchbase.com/prebuilt/n1ql/n1ql-dp3/#join.html

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

Я ответил на очень похожий вопрос здесь - посмотрите, это помогает.

person theMayer    schedule 22.10.2014
comment
Привет @rmayer06, спасибо за интерес. Меня не волнует выходной формат, если он имеет название категории. Он может иметь атрибут categoryName или объект категории. Я понимаю, что вы говорите о внутреннем соединении, но как еще я мог это спроектировать? вставить категорию в документ? в этом случае, если категория будет обновлена ​​(хотя я не думаю, что это вероятно), мне придется обновить все продукты с этой категорией - person damian; 23.10.2014
comment
Пожалуйста, ответьте на дополнительные вопросы, которые я задавал ранее о масштабе и т. д. (комментарий к исходному сообщению). А что касается обновлений названия категории - вы правы. Компромисс дизайна. - person theMayer; 24.10.2014
comment
Я дал тебе награду, потому что срок ее действия подходил к концу. Итак, по вашему мнению, я мог бы использовать только elasticsearch? Это потому, что моя система довольно проста? Как мне обеспечить безопасность, поскольку elasticsearch не предоставляет механизмов аутентификации? - person damian; 25.10.2014
comment
Я бы порекомендовал Elasticsearch. Если вашему приложению требуется безопасность, это должно быть реализовано через уровень веб-сервиса. Используйте базу данных для хранения данных, веб-службу для подачи вашей страницы и javascript/jquery для внешнего интерфейса. - person theMayer; 27.10.2014
comment
Посмотрите ссылку на мой другой ответ на SO - я добавил ее в конец своего ответа выше. - person theMayer; 29.10.2014