Couchdb-lucene и специальные запросы для аутентифицированного пользователя

Я использую CouchDB для хранения данных, поступающих из различных источников, и coachdb-lucene для выполнения специальных запросов. Это важно для меня, потому что я отображаю данные в ленте и хочу, чтобы эту ленту можно было фильтровать. CL идеально подходит для этого.

Однако я также хочу ввести разрешения для приложения ленты — пользователь должен иметь возможность видеть элемент ленты только в том случае, если у него есть разрешение на его просмотр.

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

Единственное решение, которое я смог придумать (пока), состояло в том, чтобы добавить поле «разрешения» к каждому элементу фида, где я храню все разрешения для других пользователей (очевидно, пропуская пользователей, у которых вообще нет разрешений для этого элемента)

permissions: [{user_id: '123', read: true, write: true}, ...]

а затем проиндексировать этот массив в CL.

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

Единственным другим решением (ну, кроме сброса CouchDB) будет запуск специального запроса, не заботясь о разрешениях, а затем запуск второго запроса на сервере, который выбирает все «мои элементы» и выполняет установленное пересечение. Но эти наборы могут быть огромными (и если я их разделю, это потребует, возможно, много запросов к БД => медленных).

Подходит ли мое решение или есть что-то лучше? Или CouchDB просто не подходит для таких запросов?

Ваше здоровье!


person Tomas Brambora    schedule 06.09.2012    source источник


Ответы (1)


Вы находитесь на правильном пути, сохраняя эти данные разрешения в самом документе. Позже это будет самый простой способ создания представлений, которые позволят вам проверять разрешения пользователей. Так что не волнуйтесь и просто позвольте этому течь в этом направлении. Плохое самочувствие по поводу вложенности этих данных, вероятно, исходит из прошлых эпох, когда вы использовали SQL и RDBMS, где вы хотели нормализовать каждую таблицу. В этот раз совсем другое :)

Кстати, единственная возможность выполнить «СОЕДИНЕНИЕ» в CouchDB — это использовать связанные документы. Если вам интересно, вы можете попробовать. Однако это не позволит вам заглянуть внутрь связанного документа при создании представления.

person AVK    schedule 13.05.2014