Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Структура хранения клиентов принадлежащих нескольким категориям.  [new]
Гость+
Guest
Добрый день.

Вроде как вопрос простой, создаём таблицу клиентов, создаём таблицу категорий, связь многие- ко многим.

На данный момент база клиентов примерно 250т. записей. Нужно написать справочник, который будет работать очень быстро.
Задачи, где могут возникать моменты с производительностью:
- отобразить клиентов, которые принадлежат нескольким категориям.
- отобразить клиентов, которые принадлежат нескольким категориям и не включать клиентов, которые принадлежат определённым категориям.

Допустим структура след:

Client
============
ID INT
FullName NVARCHAR(100)

Category
============
ID INT
ClientID INT
Name NVARCHAR

Для первого момента, я так думаю будет лучше всего использовать след. SQL скрипт:
SELECT Client.ID, Client.FullName FROM Client JOIN Category ON Client.ID = Category.ClientID WHERE Category.ID IN (1, 5, 7)
GROUP BY Client.ID, Client.FullName

Это действительно самый верный подход? (меня тут больше смущает группировка)

А вот как сделать второй вариант, тут затрудняюсь и прошу помощи у ВАС))))
7 дек 15, 10:19    [18522459]     Ответить | Цитировать Сообщить модератору
 Re: Структура хранения клиентов принадлежащих нескольким категориям.  [new]
Гость+
Guest
Блеснул знаниями по структуре))))


Category
============
ID INT
Name NVARCHAR

Client
============
ID INT
FullName NVARCHAR(100)

CategoryClient
============
IDCategory INT
IDClient INT

и запрос:
SELECT Client.ID, Client.FullName FROM Client JOIN CategoryClient ON Client.ID = CategoryClient.ClientID WHERE CategoryClient.CategoryID IN (1, 5, 7) GROUP BY Client.ID, Client.FullName
7 дек 15, 10:23    [18522481]     Ответить | Цитировать Сообщить модератору
 Re: Структура хранения клиентов принадлежащих нескольким категориям.  [new]
база клиентов
Guest
Гость+,

автор
Задачи, где могут возникать моменты с производительностью:
- отобразить клиентов, которые принадлежат нескольким категориям.
- отобразить клиентов, которые принадлежат нескольким категориям и не включать клиентов, которые принадлежат определённым категориям.

передавать перечень категорий, фильтровать по exists/not exists
умножать и схлопывать для этих целей не нужно
7 дек 15, 11:00    [18522715]     Ответить | Цитировать Сообщить модератору
 Re: Структура хранения клиентов принадлежащих нескольким категориям.  [new]
Гость+
Guest
база клиентов
Гость+,

автор
Задачи, где могут возникать моменты с производительностью:
- отобразить клиентов, которые принадлежат нескольким категориям.
- отобразить клиентов, которые принадлежат нескольким категориям и не включать клиентов, которые принадлежат определённым категориям.

передавать перечень категорий, фильтровать по exists/not exists
умножать и схлопывать для этих целей не нужно


Фильтровать где, на сервере?
Я не совсем понимаю что значить фильтровать?
7 дек 15, 11:17    [18522842]     Ответить | Цитировать Сообщить модератору
 Re: Структура хранения клиентов принадлежащих нескольким категориям.  [new]
invm
Member

Откуда: Москва
Сообщений: 9687
Гость+
- отобразить клиентов, которые принадлежат нескольким категориям.
Любой категории из некоего перечня или всем?
Если второе, читайте про реляционное деление.
7 дек 15, 11:26    [18522914]     Ответить | Цитировать Сообщить модератору
 Re: Структура хранения клиентов принадлежащих нескольким категориям.  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
Гость+
Задачи, где могут возникать моменты с производительностью:
- отобразить клиентов, которые принадлежат нескольким категориям.
- отобразить клиентов, которые принадлежат нескольким категориям и не включать клиентов, которые принадлежат определённым категориям.
Не слишком понятно условие: отобразить клиентов, которые принадлежат одновременно всем категориям? Или хотя бы одной? Впрочем, всё это можно решить по одной схеме:

SELECT Client.ID, Client.FullName
FROM (
  SELECT ClientID,
    SUM(case when ID in (1, 5, 7) then 1 else 0 end) as S1,   -- разрешённые категории
    SUM(case when ID in (8, 10) then 1 else 0 end) as S2      -- запрещённые категории
  FROM Category 
  WHERE ID IN (1, 5, 7, 8, 10)  -- разрешённые и запрещённые категории вместе
  GROUP BY ClientID
) A
  JOIN Client ON Client.ID = Category.ClientID
WHERE S1>0  -- выбрать тех, кто попадает в любую из разрешённых категорий
-- WHERE S1=3  -- выбрать тех, кто попадает одновременно во все разрешённые категории
-- WHERE S1>0 and S2=0  -- выбрать тех, кто попадает в любую из разрешённых категорий, и не попадает ни в одну запрещённую
7 дек 15, 11:27    [18522922]     Ответить | Цитировать Сообщить модератору
 Re: Структура хранения клиентов принадлежащих нескольким категориям.  [new]
база клиентов
Guest
Гость+
база клиентов
Гость+,

пропущено...

передавать перечень категорий, фильтровать по exists/not exists
умножать и схлопывать для этих целей не нужно


Фильтровать где, на сервере?
Я не совсем понимаю что значить фильтровать?

затрудняюсь ответить что-то односложное.
WHERE - это, в целом, фильтровать. джойны тоже вполне. "условия отбора" = "условия фильтрации"

exists/not exists - на сервере. вы же про sql спрашиваете.
7 дек 15, 11:49    [18523141]     Ответить | Цитировать Сообщить модератору
 Re: Структура хранения клиентов принадлежащих нескольким категориям.  [new]
Гость+
Guest
Serg_77m,

Супер!
Спасибо
7 дек 15, 12:09    [18523358]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить