2009-06-10 7 views
2

Je crée une galerie. Je veux que les utilisateurs puissent choisir qui peut voir leurs photos par groupe ou par individu. Je figure que je devrais avoir une table can_see avec deux colonnes (user_id, photo_id). Cela devrait fonctionner pour les particuliers, mais cela ne fonctionnera pas si je jette group_id s là aussi. Je pense que la meilleure approche pourrait être simplement d'ajouter chaque individu dans le groupe sélectionné à cette table quand un groupe est choisi, plutôt que son group_id. Cela crée cependant plus d'entrées dans la table pour passer au crible plus tard. Est-ce toujours la meilleure approche?Question de conception de base de données de galerie concernant les autorisations/visibilité


Voici ce que je pense:

users: id, username, ... 
photos: id, album_id, ... 
albums: id, user_id (owns all photos in album), .... 
can_see: user_id, photo_id 
groups: id, user_id(owner), name 
member_of: user_id, group_id 

Répondre

2

Si vous souhaitez éliminer le nombre d'entrées à la recherche, je pencherais pour l'approche suivante.

User Table - UserID, UserName 
Group Table - GroupID, GroupName 
User Group Table - GroupID, UserID 
Photo Table - PhotoID, UserID 

Si vous souhaitez accéder à des photos pour un utilisateur spécifique, vous obtiendrez l'ID utilisateur de la table d'utilisateur et faire une recherche par cet ID sur la table photo.

Si vous souhaitez accéder à des photos pour un groupe, vous obtiendrez les ID utilisateur de la table Groupe d'utilisateurs et effectuerez une recherche de ces ID sur la table photo.

*** commentaire détaillé

ok laissez-moi épelle pour vous ... Il sont quelques actions ici pour être effectuée par un propriétaire de photo ou du moins qui est ma compréhension. 1. Le propriétaire de la photo peut accorder l'accès à viwership à un seul utilisateur. Cela créera un nouvel enregistrement dans la table utilisateur pour un nouvel utilisateur. Pour les utilisateurs existants, ce n'est pas le cas pour . Cela créera également un nouvel enregistrement dans le tableau avec l'ID utilisateur existant ou nouvellement créé. 2. Le propriétaire de la photo peut accorder l'accès à un groupe d'utilisateurs. Cette action créera un nouvel enregistrement dans la table de groupe pour un nouveau groupe et pour le groupe existant ne le fera pas. Tous les nouveaux utilisateurs dans le groupe nécessiteront de nouveaux enregistrements ajouts à la table utilisateur. Finalement, la table de la photo sera mis à jour avec autant d'enregistrements qu'il ya sont les utilisateurs du groupe.

Maintenant, pour accéder aux photos ... Il y a plusieurs cas

  1. Un seul utilisateur qui ne fait pas partie à un groupe peut demander l'accès à la photo .
  2. Un seul utilisateur faisant partie d'un groupe peut demander l'accès à la photo.

Dans eiher de ces cas, je suppose l'entrée de l'application ont juste le nom d'utilisateur & la photo pour accès (Cela devrait effectivement être l'album . Depuis vous avez modifié votre question I je ne sais pas si c'est toujours le cas).Dans ce cas, vous effectuez une recherche dans la table utilisateur pour obtenir l'ID utilisateur pour le nom d'utilisateur et vous faites une autre recherche dans le tableau photo à voir si cet ID utilisateur est accordé accéder à la photo demandée ou non (par vérifier si l'enregistrement existe ou non). Donc, la question suivante est ... pourquoi avons-nous besoin de groupe & tables de groupes d'utilisateurs? Cette est nécessaire pour le propriétaire de la photo à facilement accorder et révoquer les privilèges d'accès à partir de l'interface utilisateur. Avec ces tableau il est facile de construire une interface utilisateur à montrer le propriétaire de la photo quels groupes ont été créés et les membres de chaque groupe.

Certains éléments manquent la question ... Par exemple, comment demande-t-on l'accès à la visualisation? Quelles informations seront fournies en entrée à l'application? Tous les commentaires et réponses mises à jour de moi sont basées sur le lot des hypothèses. Alors maintenant, nous savons pourquoi exigences doivent être clairement out ;-)

+0

Je pense que vous ou moi avons un malentendu. Nous ne sommes pas à la recherche de photos, nous essayons de déterminer qui a la permission de voir la photo. Comment feriez-vous cela avec cette configuration? Je ne sais même pas comment fonctionne votre "table de groupes d'utilisateurs". Si j'ai 5 utilisateurs qui font tous partie du même groupe, que se passe-t-il? Le nom du groupe est répété 5 fois? C'est juste un mauvais design. Je vais ammend ma question avec ma configuration ... – mpen

+0

D'accord. Ma conception antérieure pour la table de groupe d'utilisateurs avec le nom de groupe répété n'est pas un bon design comme vous l'avez souligné à juste titre. J'ai modifié le design pour refléter ma pensée actuelle. En cherchant, je voulais dire accéder. – msvcyc

+0

Je ne comprends toujours pas. Vous le faites sonner comme un utilisateur individuel * possède * la photo, ou l'ensemble * possède * la photo. Que se passe-t-il si l'utilisateur A télécharge la photo B, puis arrive l'utilisateur C qui veut voir la photo B. Comment vérifions-nous s'il a la permission de le faire? D'après vous, nous tirons son UserID de la Table Utilisateur, puis vérifions la Table Photo ... mais la Table Photo décrit simplement qui en est le propriétaire. Il vous manque toujours une table de visibilité. – mpen

0

Une autre solution que je pensais, nous pouvons ammend la table can_see pour inclure une colonne group_id, puis pour vérifier si un utilisateur peut voir une photo :

SELECT 1 FROM can_see WHERE user_id=USERID AND photo_id=PHOTOID 

ou

SELECT 1 FROM can_see JOIN member_of ON can_see.group_id = member_of.group_id WHERE member_of.user_id=USERID AND can_see.photo_id=PHOTOID 

Il est colonne supplémentaire qui pourrait souvent être null et i Cela signifie que nous devons faire 2 requêtes au lieu de 1 pour vérifier les permissions, mais cela maintient la table can_see un peu plus petite, et cela signifie que vous pouvez modifier le groupe après que les permissions ont été définies.

Questions connexes