Frage

Ich versuche zu verstehen, wie die Leseseite von CQRs mit einer großen Dokumentverwaltungsanwendung (Videos/ PDF -Dateien/ etc) funktionieren kann, die wir schreiben.

Wir möchten eine Liste aller Dokumente anzeigen, für die der Benutzer die Berechtigung bearbeitet hat (dh alle Dokumente anzeigen, die der Benutzer bearbeiten kann). Es kann 10.000 Dokumente geben, die ein bestimmter Benutzer bearbeiten kann.

Im Allgemeinen habe ich gelesen, dass die eine einzelne "Tabelle" (flache Struktur) für die meisten Bildschirme ausreichen sollte und mit Berechtigungen eine Tabelle pro Rolle haben könnten.

Wie würde ich mein Lesemodell entwerfen, damit ich schnell die Dokumente erhalten kann, die ich für einen bestimmten Benutzer bearbeiten kann?

Derzeit kann ich eine Tabelle sehen, die meine Dokumente hält, eine andere, die die Benutzer hält, und eine andere Tabelle, die die "Bearbeitungsrolle" zwischen dem Benutzer und den Dokumenten verknüpft. Also mache ich Verbindungen, um die Daten für diesen Bildschirm zu erhalten.

Außerdem kann es Rollen zum Löschen, Betrachten usw. geben.

Ist das in diesem Fall der richtige Weg?

JD

War es hilfreich?

Lösung

Sie können eine flache Tabelle mit einer Benutzer -ID zusammen mit den jeweiligen denormalisierten Dokumentinformationen bereitstellen.

SELECT * FROM documents_editable_by_user WHERE UserId = @UserId
SELECT * FROM documents_deletable_by_user WHERE UserId = @UserId
SELECT * FROM documents_visible_for_user WHERE UserId = @UserId

Sie können jedoch sogar dynamisch eine Tabelle/Liste pro Benutzer in Ihrem Lesemodellspeicher erstellen. Dies wird ziemlich einfach, sobald Sie von einem SQL-basierten Lesestore zu NoSQL wechseln (falls Sie es noch nicht getan haben).

Vor allem, wenn Zehntausende von Dokumenten für einen Benutzer sichtbar oder bearbeitet werden können, können abgeflachte Tische im Vergleich zu Verknüpfungen einen echten Leistungsschub verleihen.

Andere Tipps

Als ich ein Lesemodell hatte, das in Form einer Filterfischform (Wortspiel nicht beabsichtigt) ansah, verwendete ich die Rhino-Sicherheit als Grundlage eines Autorisierungsdienstes.

Ich habe das System so konfiguriert, dass die Tabellen des Autorisierungsdienstes über das Pub -Sub -System und den SQL Server -Agenten des SQL Servers an die Clients geführt wurden, die teilweise die Denormalisierten Daten anzeigen - ich lasse dann dann Rhino.Security Schließen Sie sich dem Autorisierungsmodell zusammen in das Lesemodell an, das probenerat ist.

Da ich im Wesentlichen nie in die Autorisierungstabellen des Lesemodells aus dem Lesemodell geschrieben habe, haben wir eine schöne Verkapselung in der Datenbank und Logik des Autorisierungsdienstes erhalten, da die Autorisierung nur durch geändert wurde das Service, und es war global einzigartig und spezifisch (konsistent) für diesen Service. Dies bedeutete, dass unsere benutzerdefinierte GUIs für den Umgang mit fortgeschrittenen (hierarchialen Unternehmen, Benutzergruppen, Benutzern, Berechtigungen, Per-Entfaltungs-Permissions) Autorisierungsanforderungen immer noch Crud gegen dieses Autorisierungsmodell ausführen konnten, und dies würde in sanftem Echtzeit auf jedes Lesemodell vorangetrieben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top