Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Владислав Колосов
емил_
Клиенты не должны видеть данные другого клиента.


Как связаны видимость данных и нумерация записей? Не вижу связи.

А тем не менее она есть (как тот суслик) ;)
Вот Вы клиент. Вы сделали заказ сегодня, получили номер 1000, сделали заказ через неделю, получили номер 1500. Это означает что остальные клиенты за неделю сделали 499 заказов ;) Да, Вы не видите их суммы, не видите кто именно их сделал - но таки общеее количество видно.
Так что откуда берется требование - понятно. Другой вопрос что реализация этого требования "небесплатна" - либо будут тратиться ресурсы, либо будет сложно поддерживать и масштабировать, либо...
5 окт 15, 15:44    [18236931]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Кот Матроскин
Владислав Колосов
пропущено...


Как связаны видимость данных и нумерация записей? Не вижу связи.

А тем не менее она есть (как тот суслик) ;)
Вот Вы клиент. Вы сделали заказ сегодня, получили номер 1000, сделали заказ через неделю, получили номер 1500. Это означает что остальные клиенты за неделю сделали 499 заказов ;) Да, Вы не видите их суммы, не видите кто именно их сделал - но таки общеее количество видно.
Так что откуда берется требование - понятно. Другой вопрос что реализация этого требования "небесплатна" - либо будут тратиться ресурсы, либо будет сложно поддерживать и масштабировать, либо...

делаете identity и второ поле - хэш этого идентити без коллизий. Клиенту показывай хэш.
Или вообще guid
5 окт 15, 15:53    [18237000]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ivan Durak
делаете identity и второ поле - хэш этого идентити без коллизий. Клиенту показывай хэш.

Клиенту вообще можно показывать row_number только его запроса
5 окт 15, 15:56    [18237011]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Ivan Durak,

Изменение типа поля - это не такая простая вещь. Одно дело просить клиента называть (или говорить ему) номер заказа как небольшое число из 2-3 знаков, и совсем другое - номер заказа как хэш (не говоря уж про гуид).
5 окт 15, 15:59    [18237030]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1963
емил_
Делается "multi tenancy" програма (SaaS). База MSSQL 2014.
В одной таблице будут данные многих клиентов. Данные не пересекаются.
Клиенты не должны видеть данные другого клиента.
В таблице есть поле CUSTOMER_ID идентифицировать клиента.
Клиенты порядка 1000 или несколько тысяч в будущее.
В таблице есть поле например ORDER_ID которое нужно заполнить последовательным числами.

Вопрос: как сделать последовательность чисел в ОДНОЙ таблице для каждого клиента в отделности?
Т.е. для каждго CUSTOMER_ID в отделности.

Если CUSTOMER_ID=1 използовал номера от 1 до 1000 то следующий номер для него должен быть 1001,
независимо от того что другие клиенты в течение этого времени тоже получали их номера.

Я знаю по identity и sequence, но я не знаю, как их использовать в этом случае - одна таблица.
Только возможно, использовать столко sequence сколько есть клиентов.
Возможно есть более элегантное решение?


Вопрос - а где Вы собираетесь использовать этот номер? Если в отчётности - создайте общее поле Identity, а в отчётах используйте Row_number(), Dense_Rank или прочие функции для нумерации строк запросов на основе Identity и Customer_ID. (читайте описания указанных функций, какая лучше подойдёт).
А вот для оперативного использования - нумерации счетов и прочего - Вам уже подсказали.
5 окт 15, 16:00    [18237039]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Glory
Ivan Durak
делаете identity и второ поле - хэш этого идентити без коллизий. Клиенту показывай хэш.

Клиенту вообще можно показывать row_number только его запроса


Очень плохо - если, например, Вы решите перенести в архив старые заказы, немедленно "сьедет" вся текущая нумерация.
5 окт 15, 16:02    [18237063]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
Кот Матроскин
Glory
пропущено...

Клиенту вообще можно показывать row_number только его запроса


Очень плохо - если, например, Вы решите перенести в архив старые заказы, немедленно "сьедет" вся текущая нумерация.

Плохо кому ?
Вы же не знаете, как ТС собирается _использовать_ эти номера.
Это же явно не ПК
5 окт 15, 16:04    [18237081]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Glory
Кот Матроскин
пропущено...


Очень плохо - если, например, Вы решите перенести в архив старые заказы, немедленно "сьедет" вся текущая нумерация.

Плохо кому ?
Вы же не знаете, как ТС собирается _использовать_ эти номера.
Это же явно не ПК

Из слов ТС "клиенты не должны видеть чужие данные" я предполагаю, что номер каким-то образом отдается клиенту - и вполне может вместе с ID клиента составлять ключ (не обязательно первичный).
5 окт 15, 16:15    [18237173]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
Кот Матроскин
Из слов ТС "клиенты не должны видеть чужие данные" я предполагаю, что номер каким-то образом отдается клиенту - и вполне может вместе с ID клиента составлять ключ (не обязательно первичный).

И почему клиенту должно стать плохо от того, что ему отображается row_number ?
Вы откуда то знаете, как клиент ТС-а воспринимает значение в этом поле результата запроса ?
5 окт 15, 16:18    [18237190]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
емил_
Guest
"...как ТС собирается _использовать_ эти номера..."

это может быть номер заказа в ресторане (уже говорил).
И это будет печатется (квитанция) крайнему клиенту.
И владелец ресторана когда получает ежедневний отчет видит:
сегодня первий заказ например №1200 - полследний №1400 - аха я сделал 200 заказов сегодня.
Владелец может поинтересоватся подробностями заказа 1234 например.
И если от вместо номеров от 1200 до 1400 видит хеши,GUID, rowId или что то другое то
владелец ресторана пошлет нас подальше.

Кроме номера заказа в ресторане эсть много чего что нужно нумерировать.
Номер рабочего например. Если работники получили последователно номера 100,200,300 вместо 100,101,102 то же
самое - пошлет нас подальше. И т.д.
Его не интересует что номер работника №101 използован в другом ресторане - ето чушь.

"Вот Вы клиент. Вы сделали заказ сегодня, получили номер 1000, сделали заказ через неделю,
получили номер 1500. Это означает что остальные клиенты за неделю сделали 499 заказов ;)
Да, Вы не видите их суммы, не видите кто именно их сделал - но таки общеее количество видно."

Именно.

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

Вот именно то и спрашиваю - как другие решают ету проблему?
5 окт 15, 16:20    [18237207]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
емил_
это может быть номер заказа в ресторане (уже говорил).

Мда. Вы знаете что такое ПервичныйКлюч ? А составной ПервичныйКлюч ?
Нужно не то, как вы называет этот "номер", а где и как он _используется_

емил_
аха я сделал 200 заказов сегодня.

С ума сойти. А если там пропуски в номерах, то что он увидит из номера 1400 ?
5 окт 15, 16:25    [18237243]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Glory
Кот Матроскин
Из слов ТС "клиенты не должны видеть чужие данные" я предполагаю, что номер каким-то образом отдается клиенту - и вполне может вместе с ID клиента составлять ключ (не обязательно первичный).

И почему клиенту должно стать плохо от того, что ему отображается row_number ?

Потому что завтра (после переноса старых заказов в архив) ему начнет показываться другой row_number. Я бы на месте клиента был бы несчастлив, если бы получил номер заказа, потом решил бы по нему получить какую-то детализацию и получил бы в ответ болт.
Glory
Вы откуда то знаете, как клиент ТС-а воспринимает значение в этом поле результата запроса ?

поле ORDER_ID? Как номер заказа, that easy.
5 окт 15, 16:30    [18237279]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
емил_
Кроме номера заказа в ресторане эсть много чего что нужно нумерировать.
Номер рабочего например. Если работники получили последователно номера 100,200,300 вместо 100,101,102 то же
самое - пошлет нас подальше. И т.д.

Я так понимаю, что ваши заказчики настолько круты в базах данных, что лезут прямо в стуктуры и код и сразу посылают всех, кто сделал нумерацию не 100,101,102 а 100,200,300
Зачем тогда вы задаете вопрос здесь, если ваш заказчик вам сам все расскажает о генерации номеров ?
5 окт 15, 16:31    [18237285]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
Кот Матроскин
Потому что завтра (после переноса старых заказов в архив) ему начнет показываться другой row_number. Я бы на месте клиента был бы несчастлив, если бы получил номер заказа, потом решил бы по нему получить какую-то детализацию и получил бы в ответ болт.

И что ? Некоторые клиенты, например, хотят видеть нумерацию с начала каждый месяц
Им почему то плохо от этого не становится
5 окт 15, 16:32    [18237293]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
Кот Матроскин
Glory
Вы откуда то знаете, как клиент ТС-а воспринимает значение в этом поле результата запроса ?

поле ORDER_ID? Как номер заказа, that easy.

Т.е. "номер" - это "id" ?
5 окт 15, 16:33    [18237300]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
емил_
Вот именно то и спрашиваю - как другие решают ету проблему?


От требований зависит, Вам правильно писали. Смотря чем можно жертвовать.
Метод с Maх создает "бутылочное горлышко" при интенсивной многопользовательской работе, метод со справочниками, хранящими "последний ID" - "утяжеляет" единичную вставку.
Если на "читаемость" номера наплевать - да, можно использовать метод с гуидами или хэшами.
5 окт 15, 16:36    [18237317]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Кот Матроскин
Ivan Durak,

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

А разве нету в природе хэш функций число-число?.
6 окт 15, 09:41    [18239477]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
я тока одного не понял... причем номер заказа к ключу в таблице то ?
Какая такая боля проблемма хранить ид клиента и показывать ему только его заказы ?
Протос у норм альных людей безнесс сущности (номер заказа) никак не корелируються с архитектурными (ПК таблицы) - ето вообще совершенно разные вещи
6 окт 15, 09:57    [18239560]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
0-0
Guest
емил_,

Вопрос ваш и упорство не стоят и выеденного яйца.

а почему бы не хранить два идентификатора - id как identity(1,1) монотонно возрастающий и независимый от customer_id и собственно сам customer_id.
Ну да, id будет не 1, 2, 3 для каждого customer_id, но ведь row_number() over (partition by customer_id) никто не запрещал использовать. Или ваши заказчики против row_number()?
6 окт 15, 10:41    [18239835]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
o-o
Guest
0-0
row_number() over (partition by customer_id) никто не запрещал использовать. Или ваши заказчики против row_number()?

по второму кругу, но уже новые лица?
Кот Матроскин
Glory
И почему клиенту должно стать плохо от того, что ему отображается row_number ?

Потому что завтра (после переноса старых заказов в архив) ему начнет показываться другой row_number.
Я бы на месте клиента был бы несчастлив, если бы получил номер заказа, потом решил бы по нему получить какую-то детализацию и получил бы в ответ болт.
6 окт 15, 10:57    [18239933]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
емил_
Guest
"Какая такая боля проблемма хранить ид клиента и показывать ему только его заказы ?"

"Мда. Вы знаете что такое ПервичныйКлюч ? А составной ПервичныйКлюч ?"

А я нигде не говорил про ПервичныйКлюч. Номера про которыие я говорю не имеют отношение к ПК.
Точнее могут иметь или не - зависит от конкретного случая, но моя проблема не ПК, а и как получить номера.


"Какая такая боля проблемма хранить ид клиента и показывать ему только его заказы ?"

Проблема не в том "показывать ему только его заказы" - проблема как получить номера.



"Ну так вот "хочу" и "не хочу" - это не техническая информация "

Попробую еще раз:

Таблица:

CREATE TABLE ORDERS
(
CUSTOMER_ID int not NULL,
ORDER_ID int not NULL
...другие поля
)

Есть 100 ресторан (независимие). Каждый ресторан имеет уникальный customer_id - скажем 1,2, ... 100.
В каждом ресторане 10 официанта. Каждый официант делает заказ (ето ORDER_ID - кто то заказал кофе).
Каждый официант вводить данние заказа в программу. Данние для заказа записывается в базу.
К базе приходят 100*10 = 1000 запроса типа:

От первого ресторана:
INSERT INTO ORDERS (CUSTOMER_ID,ORDER_ID,...) VALUES (1, 1,...)
INSERT INTO ORDERS (CUSTOMER_ID,ORDER_ID,...) VALUES (1, 2,...)
INSERT INTO ORDERS (CUSTOMER_ID,ORDER_ID,...) VALUES (1, 3,...)
и тд.

От N-того ресторана:
INSERT INTO ORDERS (CUSTOMER_ID,ORDER_ID,...) VALUES (N, 1,...)
INSERT INTO ORDERS (CUSTOMER_ID,ORDER_ID,...) VALUES (N, 2,...)
INSERT INTO ORDERS (CUSTOMER_ID,ORDER_ID,...) VALUES (N, 3,...)

В пике будут порядка 100 запросов в секунде.
Одна транзакция скажем для определености длиться 1 секунда потому что в транзакции есть не толко один insert в ORDERS но и другие операции - запис деталей заказа, лог, етц...
ПК для таблице ORDERS пусть будет (CUSTOMER_ID,ORDER_ID).

В этом случае (100 ресторан по 10 официанта) в конце таблица ORDERS должна имет 1000 записей.
10 записей с CUSTOMER_ID=1 и ORDER_ID - 1,2, ...10
10 записей с CUSTOMER_ID=2 и ORDER_ID - 1,2, ...10
...
10 записей с CUSTOMER_ID=N и ORDER_ID - 1,2, ...10

Проблема:
Как получит значения для ORDER_ID так что:
- эти 1000 транзакции не блокировали друг друга (много одновременых транзакции).
- ORDER_ID должен получить значения от 1 до 10 для каждого ресторана е отделности.

Мое решение: использовать 100 sequense - 1 для каждого ресторана (customer_id).
Блокировки не будут. Номера будут последовательни.

Моя проблема: для 1001 ресторана я должен создать новый sequence тоест новый database object.
Я вед не создаю новые таблицы для нового ресторана, а вот новый sequence придется.
Возможно ли достичь цел (без блокировок + последовательные ORDER_ID) без создания новых обектов в базе когда новый ресторан появится?
6 окт 15, 11:02    [18239951]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
0-0
Guest
o-o
0-0
row_number() over (partition by customer_id) никто не запрещал использовать. Или ваши заказчики против row_number()?

по второму кругу, но уже новые лица?
Кот Матроскин
пропущено...

Потому что завтра (после переноса старых заказов в архив) ему начнет показываться другой row_number.
Я бы на месте клиента был бы несчастлив, если бы получил номер заказа, потом решил бы по нему получить какую-то детализацию и получил бы в ответ болт.


А кто мешает после помещения в архив сохранять count(1) по customer_id в поле неархивной таблицы и потом прибавлять его к row_number()? Религия? Заказчик?
6 окт 15, 11:04    [18239956]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
емил_
Проблема:
Как получит значения для ORDER_ID так что:
- эти 1000 транзакции не блокировали друг друга (много одновременых транзакции).
- ORDER_ID должен получить значения от 1 до 10 для каждого ресторана е отделности.

Вам уже объяснили, что придется _выбрать_
Нет одного суперзамечательного решения
емил_
В этом случае (100 ресторан по 10 официанта) в конце таблица ORDERS должна имет 1000 записей.
10 записей с CUSTOMER_ID=1 и ORDER_ID - 1,2, ...10
10 записей с CUSTOMER_ID=2 и ORDER_ID - 1,2, ...10
...
10 записей с CUSTOMER_ID=N и ORDER_ID - 1,2, ...10

Вы можете внятно ответить на простойвопрос:
Почему в таблице дожно именно _храниться_ ORDER_ID - 1,2, ...10
6 окт 15, 11:19    [18240034]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
o-o
Guest
емил_
Мое решение: использовать 100 sequense - 1 для каждого ресторана (customer_id).
Блокировки не будут. Номера будут последовательни.

или не будут.
роллбэк как и в случае IDENTITY оставит дыры
BOL: Sequence Numbers
The sequence object generates numbers according to its definition,
but the sequence object does not control how the numbers are used.
Sequence numbers inserted into a table can have gaps when a transaction is rolled back,
when a sequence object is shared by multiple tables,
or when sequence numbers are allocated without using them in tables.
When created with the CACHE option, an unexpected shutdown, such as a power failure,
can lose the sequence numbers in the cache.

Sequence Numbers
6 окт 15, 11:22    [18240050]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Ivan Durak
Кот Матроскин
Ivan Durak,

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

А разве нету в природе хэш функций число-число?.


Обычно хэш-функция не сохраняет (и не должна сохранять) порядок числа. "Сообщите подробности по заказу №11" и "Сообщите подробности по заказу 1 983 665 043 " - почувствуйте разницу.
6 окт 15, 12:00    [18240297]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить