Реализовать доступ уровня пользователя / группы пользователей к записям в базе данных (на уровне приложения) - PullRequest
0 голосов
/ 07 июня 2009

У меня есть следующий сценарий:

1) a Пользователи Таблица: </p> <pre><code>int Id (PK, Identity) // more users table columns (firstname, etc.)

2) a Группы пользователей таблица: </p> <pre><code>int Id (PK, Identity) // more usergroups table columns (title etc.)

3) a UserGroupMembership таблица:

</p> <pre><code>int Id int UserId (FK->Users.Id) int UserGroupId (FK->UserGroups.Id)

и 4) a Контакты Таблица:

</p> <pre><code>int Id (PK, Identity) // more contacts table columns..

Я ищу способ иметь контакты в моей таблице Contacts либо «общедоступной» (ее может видеть каждый), либо ограниченной любой комбинацией из одной / нескольких групп пользователей или отдельных пользователей. *

Полностью застрял здесь .... Помощь?

Ответы [ 3 ]

1 голос
/ 07 июня 2009

почему бы не использовать дополнительную таблицу, касающуюся контактов и групп пользователей? например,

ContactsAccess

int UserGroups.Id (FK)
int Contacts.Id (FK)

Вы можете использовать специальное значение (например, ноль (0)) для обозначения неограниченного доступа или изменить таблицу Контакты , чтобы указать тип разрешения.

0 голосов
/ 15 декабря 2010

Вот два способа сделать это без необходимости создания дополнительной таблицы M-N для каждой сущности в вашей базе данных, как предложено в других ответах:

  1. Вы можете добавить таблицу EntityBase, от которой будут наследоваться все сущности (имеется в виду отношение 1-1 на идентификатор сущности).

    Следовательно, будет только одна таблица EntityAccess с EntityId (fk), связывающей таблицу EntityBase. Таблица контактов будет иметь столбец EntityId (fk, pk). Вы бы запросили таблицу EntityBase, когда захотите.

    IIRC - это подход, используемый в VTiger CRM, где есть общая таблица CRMEntity.

  2. Есть еще один способ, используемый MS Dynamics CRM. Он не позволяет добавлять промежуточные таблицы для каждой сущности, но не обеспечивает ограничения ссылок.

Суть этого подхода заключается в следующей таблице:

PrincipalObjectAccess
---------------------
...
PrincipalId
ObjectId
PrincipalTypeCode
ObjectTypeCode
AccessRightMask
...

PrincipalId может указывать либо на UserId, либо на TeamId (команда - это просто группа пользователей). ObjectId может указывать на ЛЮБУЮ сущность в вашей модели в зависимости от ObjectTypeCode (будь то Контакт, Аккаунт, Проект и т. Д.)

AccessRightMask - это двоичный флаг перечисления:

Read = 1
Write = 2
Append = 4
AppendTo = 16
Create = 16
Delete = 65536
Share = 262144
Assign = 524288
0 голосов
/ 07 июня 2009

Вероятно, я бы использовал таблицу, похожую на следующую (MySQL):

CREATE TABLE `ContactsVisibleTo` (
    `ContactID` INT NOT NULL ,
    `Type` ENUM( 'User', 'Group' ) NOT NULL ,
    `ID` INT NOT NULL
)

Уникальный или первичный ключ во всех трех полях, вероятно, тоже неплохая идея. Переключение между публичным / приватным должно быть полем в таблице Contacts.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...