2010-04-14 2 views
3

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

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

Таким образом, мы пришли к этой модели данных:

user's organization

Так что теперь вопрос: Как это лучше, чтобы отделить данные?
Это единственная альтернатива я вижу:

  • SQL JOIN на всех соответствующих таблиц (Все таблицы, содержащие данные не должны не всегда вступать в организации) - Все запросы должны теперь добавить дополнительный присоединиться к организации , и если соединение не существует, нам нужно создать новый внешний ключ.

Но я чувствую дополнительное соединение (у нас есть около 20 таблиц, для которых требуется дополнительное соединение) довольно дорого.
Надеюсь, есть некоторые другие рекомендации или решения, которые мы можем рассмотреть.

PS: Это веб-приложение разработано с использованием Java/JSF/Seam (но я не знаю, если это уместно)

UPDATE

Я хочу уточнить кое-что. Моя консервация - это не безопасность, а производительность. Мы добавили внешний ключ в организацию ко всем соответствующим таблицам, которые имеют общие данные, и мы используем зарегистрированную в организации пользователя для фильтрации данных.

Все, что я хочу знать, это хорошее архитектурное решение (внутреннее соединение) или если мы должны сделать что-то еще (то есть: загрузить все общие данные и фильтровать в памяти вместо sql-соединения).

+0

Но если это одна и та же компания, разделенная на отдельные организации под капотом, а пользователь играет роль в одной организации, а также роль в другой (например, они работают в двух офисах). Эта модель не сработает для этого, возможно ли это? Надеюсь, я не пропустил вопрос :-) – WestDiscGolf

+0

Нет, это не возможно. Пользователь может быть только частью одной организации, и нет «компании». Организация - это просто имя. Это действительно более демографический. Так что на самом деле может быть страна (имеет смысл) –

ответ

4

Вам действительно нужно понять разницу между уровнем стойкости и уровнем приложения.

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

Изменение дизайна базы данных должно производиться только по соображениям производительности, не для обеспечения безопасности, которое должно обрабатываться в приложении.

+0

Чтобы добавить еще, вы можете взглянуть на Spring Security http://static.springsource.org/spring-security/site/index.html. Он позволяет декларативно определять требования безопасности приложения. –

+0

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

+0

Почему вы решили присоединиться? Разве нет другого способа спроектировать запрос? –

1

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

В качестве альтернативы, если вы разрешаете прямой доступ к базе данных, вам необходимо создать логин/пользователь (в зависимости от используемой базы данных) для каждой организации или пользователя, а затем ограничить доступ этих логических/пользовательских объектов к параметризованным хранимым процедурам, а не базовые таблицы. Это приведет к возврату системы безопасности в базу данных, которая является более рискованной, но все же способной.

Как мета изменения для поддержки столбца организации, параметризуя хранимые процедуры будет достаточно тривиально:

select @organizationId = organizationId from User where User.id = @currentUserId 

select * from User where organizationId = @organizationId 

(в зависимости от Sql аромата вам нужно будет приложить некоторые объекты например, `` User , [ Пользователь] и т. Д.)

+0

Итак, как это отличается от создания дополнительного соединения в sql? Будет ли это работать быстрее, чем соединение? –

+0

@Shervin Если вы выполняете рекурсивное соединение, он будет автоматически присоединяться к таблице User для количества строк, сколько есть в запросе, - но нажав поиск в organizationId в скалярный запрос, а затем используя это постоянное значение, будет выполняться то же самое задание будет быстрее, чем если бы тысячи самоубийств. – amelvin

+0

Если есть только несколько строк, тогда эта техника может быть не быстрее (хотя она никогда не будет медленной, пока организационные и пользовательские ключи являются ключами). – amelvin

0

Я не вижу причины, что Организация должна быть «присоединена» вообще.

Если в ваших таблицах «данные» есть столбцы OrganizationID, вы можете найти «organizationID» от пользователя, а затем добавить это как условие для соединения.

EX:

select @OrganizationId = organizationId from User where User.id = @currentUserId 
select * from datatable a .... where .... AND a.organizationID = @organizationID 

См; нет соединения.

Что касается производительности, существуют разные типы соединений, и SQLServer позволяет вам намекать на тип соединения. Поэтому в некоторых случаях объединение слияния является лучшим, тогда как в чем-то подобном сценарии объединение в цикл будет лучшим. Не уверены, доступны ли эти варианты в MySQL.

Что касается всех ваших таблиц, нуждающихся в объединении или состоянии (см. Выше), есть логический ответ и ответ реализации. Ответ на выполнение зависит от вашего индексации. Если вы можете ограничить набор данных больше всего, добавив это условие, тогда вы выиграете. Но если соединение с другой таблицей, которая уже была отфильтрована, лучше справляется с сокращением строк, тогда условие будет бесполезным (или, в худшем случае, будет использовать неверный индекс). Предполагая, что у вас есть индексы в столбцах соединения и условия.

Логически, только данные, которые не являются полностью в зависимости от таблицы, которая отфильтрована организациейID, нуждается в дополнительном условии. Если у вас есть автомобильный стол и стол для фурнитуры, тогда вам нужно только отфильтровать автомобильный стол. Если по какой-то причине вам не нужно присоединяться к автомобильному столу для некоторых подключений, в этом случае вам понадобится этот идентификатор организации на таблице деталей.

Смежные вопросы