powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше ?
6 сообщений из 6, страница 1 из 1
Как лучше ?
    #36104178
Леша777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE dbo.Report 
                                   (
                                      idReport BIGINT NOT NULL IDENTITY( 1 , 1 ) PRIMARY KEY
                                     ,idUser   INT NULL    -- идентификатор пользователя 
                                     ,ReportName NVARCHAR(MAX) NOT NULL  -- имя отчета 
                                     ,UserDefinedFlag  BIT NOT NULL   -- флаг , что принадлжет пользователю 

                                   )


В системе есть 2 вида отчетов : пользовательские и общие (cоотв. UserDefinedFlag 1/ 0 )
Для пользовательских отчетов idUser IS NOT NULL для общих наоборот.
И есть 2 типовых запроса :

1) список отчетов по пользователю . Для него сделан некластерный индекс на idUser
2) любому пользователю доступны общие отчеты .

Подскажите как лучше быть :
1) Сделать индексированную вьюху на таблицу с фильтром UserDefinedFlag = 0
2) Сделать индекс UserDefinedFlag и при выборе общих отчетов указать явно хинт - использовать этот индекс.
Вставки пользовательских отчетов будут интенсивными .
С индексированными вью раньше не использовал , как лучше поступить в такой ситуации ?
Может еще как нибудь ?
Версия сервера 2005 sp3.

Спасибо.

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Как лучше ?
    #36104194
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас атрибуты дублируют друг друга, а именно - UserDefinedFlag всегда совпадает с выражением
Код: plaintext
case when idUser is null then  1  else  0  end
Не помню, нарушением какой именно из нормальных форм это является. Соответственно, я бы считал его лишним и ограничился просто выборкой отчетов, доступных для юзера, примерно таким запросом:
Код: plaintext
1.
select * from dbo.report
where nullif(idUser, @UserId) is null;
Касательно "интенсивности" вставок - надеюсь, речь идет хотя бы о сотне инсертов в секунду?..
...
Рейтинг: 0 / 0
Как лучше ?
    #36104226
Леша777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос такого вида приводит к сканированию кластерного индекса, от чего я и хочу избавится :
Код: plaintext
1.
2.
select * from dbo.report
where nullif(idUser, @UserId) is null;
...
Рейтинг: 0 / 0
Как лучше ?
    #36104236
Леша777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А по поводу номализации, понятно что моя таблица не удовлетворяет уже 1 форме , так как описывает две сущности . Целостность решена созданием 2 процедур сохранения отчетов. Интерфейсно они отличаются , а доступ всегда осуществляется только через хранимые процедуры.
...
Рейтинг: 0 / 0
Как лучше ?
    #36104257
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леша777А по поводу номализации, понятно что моя таблица не удовлетворяет уже 1 форме
Не будьте столь пугливы и не ведитесь на поводу у хулителей. Лучше RTFM.

Леша777так как описывает две сущности
Сущность одна. Отчет. Остальное - его атрибуты.

Леша777приводит к сканированию кластерного индекса, от чего я и хочу избавится
Запрос типа isnull(idUser, @UserId)=@UserId всегда можно разложить на union по разным условиям. Тем более что MSSQL, откуда мигрировали Ваш топик, хранит в индексе полностью NULL-овые значения. Впрочем, тут все намного хуже.

Решение сунуть idUser в эту таблицу в принципе неверное. Это поле определяет доступность отчета. Соответственно, если ровно 2-м пользователям доступен один отчет, вся Ваша красота накрывается медным тазом. Ваша система неусточива к минимальным высоковероятным изменениям в ТЗ. Соответственно, так делать нельзя.
...
Рейтинг: 0 / 0
Как лучше ?
    #36105099
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor TiegaelУ вас атрибуты дублируют друг друга, а именно - UserDefinedFlag всегда совпадает с выражением
Код: plaintext
case when idUser is null then  1  else  0  end
Не помню, нарушением какой именно из нормальных форм это является.Формально, третьей. Наличие функциональной зависимости между неключевыми атрибутами.
Леша777по поводу номализации, понятно что моя таблица не удовлетворяет уже 1 форме , так как описывает две сущности.Непонятно, при чём здесь 1NF . И что за 2 сущности - тоже...
Есть подозрение, что не надо преумножать сущностей и строить очередной велосипед. Задача явно напрашивается на решение с использованием стандартного механизма ограничения доступа СУБД. Отчёт регистрируется в таблице отчётов, хотя это не обязательно, можно просто использовать в названии префикс(например, что-то типа "rpt.") и выбирать по нему прямо из списка объектов БД. И на этот объект выделяются(GRANT) права на просмотр по ролям, в том числе иерархически, когда одна роль может быть включена в другую и т.д. И так вплоть до пользователей, буде таковое желание, хотя с таким желанием надо бороться, с ростом кол-ва пользователей контроль за полномочиями будет сильно усложнён.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]