Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Много не пересекающихся последовательности в одной таблице  [new]
емил_
Guest
Делается "multi tenancy" програма (SaaS). База MSSQL 2014.
В одной таблице будут данные многих клиентов. Данные не пересекаются.
Клиенты не должны видеть данные другого клиента.
В таблице есть поле CUSTOMER_ID идентифицировать клиента.
Клиенты порядка 1000 или несколько тысяч в будущее.
В таблице есть поле например ORDER_ID которое нужно заполнить последовательным числами.

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

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

Я знаю по identity и sequence, но я не знаю, как их использовать в этом случае - одна таблица.
Только возможно, использовать столко sequence сколько есть клиентов.
Возможно есть более элегантное решение?
3 окт 15, 11:29    [18230357]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
ORDER,
Guest
емил_,

нуу, напишешь в процедуре создания нового ORDER что-то типа такого, и все дела

insert into [ORDER] (ORDER_ID, CUSTOMER_ID, ...)

select
     isnull(max(ORDER_ID),0)+1
    ,@CUSTOMER_ID
    ,...

from [ORDER] where CUSTOMER_ID=@CUSTOMER_ID
3 окт 15, 23:08    [18232086]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
емил_
Guest
Я думаю, что применят MAX не очень хорошая идея.
Не уверен что ето не уменьшить производительность (даже с индексом).
Во-вторых думаю это может дать повторяющиеся числа для двух параллельных транзакций.
5 окт 15, 09:15    [18234464]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104764
емил_
Возможно есть более элегантное решение?

А критерии элегантности у вас какие ?
5 окт 15, 09:18    [18234478]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
емил_
Guest
Ну критерии элегантности в этом случае такие:
Если новый клиент будет добавлен то достаточно один insert в таблице CUSTOMERS и он уже может работат.
Тоест не нужни никакие новие database obects. Его данние ложатся в уже существующие таблицы.
А если делать через sequence то надо создание нового database obect тоест новий sequence.
Кроме этого таблиц много и sequence будут необходимы много - примерно 100.
Тоест для каждого клиент нужни 100 новие sequence. При 1000 клиентов это не много ли.
Кроме того код клиента усложняется. Имена таблиц в запросах будут одни и те же только where будет различен (where customer_id=...).
В случае с sequence то надо използоват разние имена sequence в зависимости от клиента.

Я задал этот вопрос потому что "multi tenancy" програм (SaaS) уже имеются много на свете.
Мне интересно как этот вопрос уже реализирован.
Гуглил, но не нашел ответа.
5 окт 15, 11:42    [18235418]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104764
емил_
Если новый клиент будет добавлен то достаточно один insert в таблице CUSTOMERS и он уже может работат.

Т.е. должен быть только INSERT и все ?
Больше никаких телодвижений, даже фоновых ?

емил_
Мне интересно как этот вопрос уже реализирован.
Гуглил, но не нашел ответа.

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

Конечно, нет. Мое беспокойство в том что надо делат новие database obects в случае нового клиента.
Ведь новие database obects не требуется для других операции.
Скажем добавляется новый продукт - то это просто новая строка в таблице продуктов, не надо создават что то новое (новая таблица к примеру).
А в случае нового клиента надо создават новие database obects.




"Вы не смогли отследить запросы этого SaaS к серверу?"

Ну я пока не использовал такие программы и не знаю подробности реализации и поетому и спрашиваю.
5 окт 15, 12:07    [18235590]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104764
емил_
Конечно, нет. Мое беспокойство в том что надо делат новие database obects в случае нового клиента.

Ну так определитесь уже, что элегантно, а что нет.
Или вы ждете, что вам будут подкидывать варианты, а вы будете их браковать ?


емил_
"Вы не смогли отследить запросы этого SaaS к серверу?"
Ну я пока не использовал такие программы и не знаю подробности реализации и поетому и спрашиваю.

Т.е. вы српашиваете про какой-то SaaS в форуме по MSSQL ?
5 окт 15, 12:09    [18235607]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Макбет
Member

Откуда:
Сообщений: 71
емил_,

Создай новую таблицу:
LAST_ORDER (CUSTOMER_ID, LAST_ORDER_ID)

в которой хранишь последний использованный ORDER_ID для каждого клиента
в целевой таблице проставляешь ORDER_ID при INSERT + увеличиваешь счетчик на 1 для нужного клиента в LAST_ORDER
5 окт 15, 12:15    [18235643]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5547
Нет вообще никакого смысла в изменении нумерации или выделении диапазонов поклиентно, т.к. это противоречит тезису равноправности хранении данных.

Если это же это требование бизнес процессов, то реализуйте соответствующую логику при помощи таблиц-справочников.
5 окт 15, 12:15    [18235644]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
емил_
Guest
"Ну так определитесь уже, что элегантно, а что нет."

элегантно - это не делат новие database obects в случае нового клиента.

"Т.е. вы српашиваете про какой-то SaaS в форуме по MSSQL ?"

Нет, это просто для пояснения для чего это требуется , потому что "multi tenancy" архитектура използуется широко в SaaS.
Но это не суть.

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

Если ничего кроме множества sequence нелзя придумат - это тоже ответ.
Просто хотел уточнит как другие решают этот проблем.
Вед я не первый, кто сталкивается с это.
5 окт 15, 12:20    [18235671]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
емил_
Guest
"Нет вообще никакого смысла в изменении нумерации или выделении
диапазонов поклиентно, т.к. это противоречит тезису равноправности хранении данных."

Они не равноправни.

"Если это же это требование бизнес процессов..."

Именно. Клиенты не должны видеть данные другого клиента.


"Создай новую таблицу: LAST_ORDER (CUSTOMER_ID, LAST_ORDER_ID)"

Здесь другие проблемы - таблица транзакционно зависима а sequence нет.
Не могут паралелние транзакции паралелно увеличиват счетчика.
5 окт 15, 12:25    [18235690]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104764
емил_
"Ну так определитесь уже, что элегантно, а что нет."

элегантно - это не делат новие database obects в случае нового клиента.

Отсутствие "персонального" объекта для каждого клиента означает наличие конкуренции за "общий" объект
Что вам уже не понравилось "Во-вторых думаю это может дать повторяющиеся числа для двух параллельных транзакций."
Вы и ваши клиенты готовы к ожиданиям своей очереди получения номеров ?
5 окт 15, 12:25    [18235693]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Владислав Колосов
Member

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


Как связаны видимость данных и нумерация записей? Не вижу связи.
Записи всегда равноправны в реляционном контексте. Нет большей или меньшей, лучше или худшей. Прежде всего рассматривайте решение с точки зрения хранилища. а не бизнес-требований. Вы не с того края начали решать задачу.
5 окт 15, 12:31    [18235732]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
емил_
Guest
"Вы и ваши клиенты готовы к ожиданиям своей очереди получения номеров ?"

В том то и дело что нет.
Онин клиент ето один ресторан. С одного клиента(ресторана) могут приходит множество заказов едновременно.
Тоест имеем множество транзакции. С 1000 клиентов будут возможно до 100 транзакции в секунде (в пике).
Они малие - несколко строк - но зато много.


"Отсутствие "персонального" объекта для каждого клиента означает наличие конкуренции за "общий" объект"

Я это понимаю и в етом моя проблема. Но ведь делают же люди Multi-Tenant Data Architecture Shared Schema архитектура.
По крайней мере так google утверждает :)
Вот примерная статя: https://msdn.microsoft.com/en-us/library/aa479086.aspx
Толко там ответ на мой вопрос не освечивается.


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

это может быть номер заказа в одном конкретном ресторане (т.е. для одного конкретного customer_id).


"Записи всегда равноправны в реляционном контексте."

В реляционном контексте да. Но каждый ресторан должен получить собственая номерация заказов.
Нельзя после заказа №100 следующии заказ быть №200 потому что где-то в другом (независимом) ресторане уже успели сделать 99 заказов.

При использовании много баз - для каждого клиента своя - то это проблема не встала бы.
Но используется Multi-Tenant Data Architecture Shared Schema архитектура.
Раз такое понятие сущестует - то как люди решают эту проблему?

Пока для решения видно только большое количество sequence (очень большое).
Мне не нравится, но видимо придется.
5 окт 15, 12:59    [18235936]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104764
емил_
"Вы и ваши клиенты готовы к ожиданиям своей очереди получения номеров ?"

В том то и дело что нет.
Онин клиент ето один ресторан. С одного клиента(ресторана) могут приходит множество заказов едновременно.
Тоест имеем множество транзакции. С 1000 клиентов будут возможно до 100 транзакции в секунде (в пике).
Они малие - несколко строк - но зато много.

Тогда возвращаемся опять к вопросу про элегантность

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

это может быть номер заказа в одном конкретном ресторане (т.е. для одного конкретного customer_id).

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

емил_
Но используется Multi-Tenant Data Architecture Shared Schema архитектура.
Раз такое понятие сущестует - то как люди решают эту проблему?

Причем тут понятие и способы его реализации ?
5 окт 15, 13:03    [18235968]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 7797
емил_
"Вы и ваши клиенты готовы к ожиданиям своей очереди получения номеров ?"

В том то и дело что нет.
Онин клиент ето один ресторан. С одного клиента(ресторана) могут приходит множество заказов едновременно.
Тоест имеем множество транзакции. С 1000 клиентов будут возможно до 100 транзакции в секунде (в пике).
Они малие - несколко строк - но зато много.
Гарантированно получить непрерывную возрастающую последовательность номеров невозможно без выстраивания таких запросов в очередь.
Так что вам придется выбирать - либо непрерывность, либо производительность.
5 окт 15, 13:15    [18236051]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
емил_
Guest
Ладно. По-видимому я плохо объясняю.
Glory, я понимаю то что говорите и Вы прави.
Я просто хотел знать как другие решают эту проблему,
как уже сказал - вряд ли я первый, кто сталкивается.


"Гарантированно получить непрерывную возрастающую последовательность номеров невозможно без выстраивания таких запросов в очередь.
Так что вам придется выбирать - либо непрерывность, либо производительность."

Не нужна непрерывая последовательность (пробелы разрешены) - НУЖНА СОБСТВЕНАЯ последовательность для каждого клиента.

Например client1 ползует номера 100,101,103,104 - тоест заказ 102 он пропустил (что-то случилось с заказом №102, не важно).
В тот же момент client2 ползует свои номера 200,201,202... и т.д.
Даже возможно что client2 тоже ползует номера 100,101 и т.д. в тот же момент если его нумерация дошла до 100.
5 окт 15, 13:44    [18236286]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

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

Другие решают, исходя из конкрентных технических условий.
А не для того, чтобы было "элегантно"

емил_
Не нужна непрерывая последовательность (пробелы разрешены) - НУЖНА СОБСТВЕНАЯ последовательность для каждого клиента.

Например client1 ползует номера 100,101,103,104 - тоест заказ 102 он пропустил (что-то случилось с заказом №102, не важно).
В тот же момент client2 ползует свои номера 200,201,202... и т.д.
Даже возможно что client2 тоже ползует номера 100,101 и т.д. в тот же момент если его нумерация дошла до 100.

Все знают, что такое непрерывная последовательность.
Никто не знает ваших конкретных требований.
Хочу мало объектов - это не требование.
5 окт 15, 13:50    [18236325]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
ORDER,
Guest
емил_,

если удаление будет запрещено, то можно, общую нумерацию и:
- вычисляемое поле на функции, в которой и будет нумератор (хуже)
- вью / инлайн функция, с нумератором (лучше)

на вставке - выиграите, на select-е немного проиграете...
5 окт 15, 13:53    [18236352]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
емил_
Guest
"Другие решают, исходя из конкрентных технических условий."

Разве я не дал достаточно информации?


"Хочу мало объектов - это не требование."

А не хочу мало объектов. Я хочу что бы не создавать новие объекты когда новый клиент появится.
5 окт 15, 13:54    [18236356]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Glory
Member

Откуда:
Сообщений: 104764
емил_
"Другие решают, исходя из конкрентных технических условий."

Разве я не дал достаточно информации?

Вы отличаете техническую информацию от обычной ?

емил_
А не хочу мало объектов. Я хочу что бы не создавать новие объекты когда новый клиент появится.

Ну так вот "хочу" и "не хочу" - это не техническая информация
5 окт 15, 13:56    [18236361]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
емил_
Guest
Ладно. По-видимому я плохо объясняю. Буду сам думать.
5 окт 15, 14:00    [18236390]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2328
Блог
емил_
Не нужна непрерывая последовательность (пробелы разрешены) - НУЖНА СОБСТВЕНАЯ последовательность для каждого клиента..
Ну так сделайте айдентити. Поскольку никто не видит чужие заказы, у каждого будет своя последовательность с дырками. И плевать, что эту последовательность в принципе можно выстроить в общую.
5 окт 15, 14:01    [18236393]     Ответить | Цитировать Сообщить модератору
 Re: Много не пересекающихся последовательности в одной таблице  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5547
емил_,

существует множество складских приложений, биллинговых и нигде проблема нумерации не возникает и счета клиентов не перемешиваются, каждый видит строго свою информацию.
5 окт 15, 14:31    [18236519]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить