Estou modelando um banco de dados para uma aplicação que estou desenvolvendo e estou diante de uma escolha para a qual gostaria de saber qual a melhor prática.
Digamos que eu tenha uma tabela de documentos e uma tabela de usuários. Os documentos podem ser genéricos ou relacionados a um usuário de três maneiras:
Criado pelo usuário, caso em que ele tem acesso ao documento; Sobre o usuário, caso em que o acesso ao documento pode ou não ter sido concedido a ele; Feito sob medida para aquele usuário, caso em que o acesso ao documento pode ou não ter sido concedido a ele ainda;
Eu poderia modelar um relacionamento Muitos-para-Muitos com uma tabela contendo um campo DocumentId, um campo UserId e um pouco informando se o usuário tem acesso ao documento:

Outra abordagem seria ter uma tabela Muitos-para-Muitos com um campo UserId e um campo DocumentId para vincular Documentos a Usuários que tenham acesso a eles, e também ter um campo UserId na tabela Documentos que seja Nulo se o documento for genérico ou que contenha o ID do usuário ao qual está relacionado.

A primeira abordagem parece mais organizada porque há apenas um UserId FK. A segunda abordagem, entretanto, permite filtrar documentos por usuário sem a necessidade de ingressar em uma tabela.
Qual é a melhor prática aqui?
O primeiro método é mais limpo. Gostaria de fazer algumas sugestões, no entanto. Você não precisa da chave primária substituta UserDocumentID. Uma chave composta de UserID e DocumentID seria suficiente, além de fornecer uma restrição exclusiva para a tabela de junção. Além disso, o HasAccess é realmente necessário? Acredito que a existência do registro na tabela de junção seja suficiente para indicar que o acesso foi concedido.
Você tem diferentes níveis de acesso? Somente leitura, leitura/gravação, exclusão?
Espero que isto ajude,
Matt
Parece-me que a propriedade de acesso deveria estar no nível do documento. Portanto, eu faria o seguinte. A restrição
UserId
emDocument
pode serNULL
se ela não pertencer a um usuário.