#git #design-patterns #mongodb #couchdb
#git #шаблоны проектирования #mongodb #couchdb
Вопрос:
Я создаю систему, которая позволяет пользователям создавать контент и редактировать этот контент, сохраняя при этом доступ ко всем предыдущим версиям. В некотором смысле, вы могли бы подумать о том, как StackOverflow позволяет людям публиковать вопрос, затем редактировать вопрос и по-прежнему просматривать все предыдущие версии.
Тем не менее, мои пользователи должны иметь возможность выбирать текст в содержимом и добавлять комментарий к этому конкретному тексту. Таким образом, вместо добавления комментария ко всему большому объему содержимого (как в SO), они могут настроить таргетинг на определенное слово или фразу в содержимом и прикрепить к нему комментарий.
Когда я показываю большой двоичный объект содержимого, мне нужно показать все комментарии, которые когда-либо добавлялись к нему, независимо от того, что содержит текущая версия. Итак, если слово или фраза, к которым был прикреплен комментарий, были удалены, мне все равно нужно показать комментарий, хотя этот комментарий может каким-то образом указывать на то, что он не прикреплен в текущей версии.
В Github есть функция, которая позволяет пользователям добавлять комментарий к определенной строке исходного кода. Это довольно близкое приближение к тому, что я хочу сделать. Однако, я верю в Github, комментарий прикреплен только к определенной версии этого файла. Будущие версии этого файла не будут показывать этот комментарий.
Программное обеспечение, такое как Microsoft Word, также имеет подобные функции. Но мое приложение будет веб-приложением с функциями совместной работы пользователей, поэтому несколько пользователей смогут комментировать любой заданный контент.
Я рассматриваю возможность использования решения NoSQL, такого как CouchDB или MongoDB, для хранения больших двоичных объектов содержимого и комментариев. Другой вариант — использовать git для поддержки больших двоичных объектов содержимого и управления версиями, но я не уверен, где я буду хранить информацию о комментариях.
Есть предложения о том, как наилучшим образом моделировать и хранить информацию такого типа? Как комментарий будет ссылаться на слова или фразы в содержимом? Как лучше всего узнать, прикреплен комментарий к тексту в текущей версии или нет?
Ответ №1:
Вы могли бы смоделировать таким образом, чтобы у вас был файл (или любой другой подходящий объект, который может содержать метаданные, например, в базе данных) для каждого комментария, сделанного пользователем, и создать определенное соглашение об именовании, в котором вы объединяете имя файла, к которому добавляется комментарий, SHA1 большого двоичного объекта и индекс для нескольких комментариев к каждому файлу. Итак, для каждого файла foo у вас может быть что-то вроде:
foo-blob1-0
foo-blob1-1
foo-blob1-2
foo-blob1-3
foo-blob2-0
..
foo-blobm-0
..
foo-blobm-n
Когда будет передана новая редакция файла, появится новый большой двоичный объект (или, возможно, снова появится старый большой двоичный объект, поскольку предыдущие версии файла могут быть идентичны из-за добавления и удаления текста), который люди смогут прокомментировать. Очевидно, что объектам также необходимо знать диапазон текста, к которому они комментируют.