Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уникальный ключ на 2 таблицы. / 22 сообщений из 22, страница 1 из 1
05.03.2020, 09:37
    #39934453
mih.dim1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
Добрый день.
SQL 2016 Standart SP2

Есть следующая структура:

Tab1 (ID1 bigint primary key, <прочие поля 1>)
Tab2 (ID2 bigint primary key, ID1 bigint (ссылка на Tab1),<прочие поля 2>)
Tab3 (ID3 bigint primary key, ID2 bigint (ссылка на Tab2),<прочие поля 3>)
Так хранятся данные по платежам физических лиц. Эта структура уже есть и работает, т.е. пользователи уже работают с физическим лицам через интерфейс
А также поля ID1, ID2, ID3 передаются во внешнюю систему для связи этой системы и внешней (во внешней системе сохранены ID1, ID2, ID3 и по ним идет часть обращений в эту систему)


Нужно в добавить хранение платежей по юридическим лицам.
Планируем делать так же.
Tab4 (ID4 bigint primary key, <прочие поля 4>)
Tab5 (ID5 bigint primary key, ID4 bigint (ссылка на Tab4),<прочие поля 5>)
Tab6 (ID6 bigint primary key, ID5 bigint (ссылка на Tab5),<прочие поля 6>)
Ну нужно обеспечить уникальность среди пар ID1 и ID4, ID2 и ID5, ID3 и ID6. Т.е. чтобы значение поля ID1 в Tab1 не повторялось в поле ID4 в Tab4.

Т.е. надо соблюсти уникальность на 2 таблицы и не испортить то что уже работает с учетом минимизации затрат на изменения.
...
Рейтинг: 0 / 0
05.03.2020, 09:41
    #39934454
andy st
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
mih.dim1,
Начните ID4 c 1000000000000
К тому времени, когда ID1 его догонит вы будете на пенсии
...
Рейтинг: 0 / 0
05.03.2020, 09:42
    #39934455
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
mih.dim1
Ну нужно обеспечить уникальность среди пар ID1 и ID4, ID2 и ID5, ID3 и ID6. Т.е. чтобы значение поля ID1 в Tab1 не повторялось в поле ID4 в Tab4.
Используйте разные диапазоны.
...
Рейтинг: 0 / 0
05.03.2020, 09:43
    #39934456
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
andy st
К тому времени, когда ID1 его догонит вы будете на пенсии
Уже планета будет на пенсии, не то что программист :-) Тыща миллиардов платежей, что бы я так жил.
...
Рейтинг: 0 / 0
05.03.2020, 09:52
    #39934461
andy st
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
alexeyvg
andy st
К тому времени, когда ID1 его догонит вы будете на пенсии
Уже планета будет на пенсии, не то что программист :-) Тыща миллиардов платежей, что бы я так жил.

Надо быть оптимистом :)
...
Рейтинг: 0 / 0
05.03.2020, 09:59
    #39934464
mih.dim1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
andy st
mih.dim1,
Начните ID4 c 1000000000000
К тому времени, когда ID1 его догонит вы будете на пенсии


Спасибо. Я тоже склоняюсь к этому варианту.
Хотел узнать есть ли другие варианты.
...
Рейтинг: 0 / 0
05.03.2020, 10:09
    #39934468
mih.dim1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
Я так понимаю для полной уверенности что ничего не пересечется (мы отдадим систему на откуп заказчику через пару лет), чтобы кривые ручки их админа случайно напрямую не вставили значение или что то подобное, нужно еще и ограничения поставить?

create Table tab1 (ID1 bigint identity(1,1))

ALTER TABLE tab1 ADD CONSTRAINT Id_tab1
CHECK (ID1 <1 000 000 000 000);

create Table tab4 (ID4 bigint identity(1 000 000 000 000,1))

ALTER TABLE tab4 ADD CONSTRAINT Id_tab4
CHECK (ID4 >=1 000 000 000 000);

вопрос только в том, а не создаст ли это существенную нагрузку на систему для проверки, если в 1 сек могут добавиться около 100 тыс записей в каждую из таблиц?
...
Рейтинг: 0 / 0
05.03.2020, 10:15
    #39934473
andy st
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
mih.dim1,
грамотный админ удалит ограничения и сбросит identity в 1 на обеих таблицах
...
Рейтинг: 0 / 0
05.03.2020, 11:00
    #39934508
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
А еще можно использовать отрицательные значения и декремент: identity(-1,-1).
...
Рейтинг: 0 / 0
05.03.2020, 11:12
    #39934519
mih.dim1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
andy st
mih.dim1,
грамотный админ удалит ограничения и сбросит identity в 1 на обеих таблицах


Он еще и злодей. Мне нужна защита от случайных изменений по не знанию. Если он целенаправлено "гадит", то он и базу удалит без проблем.

Вопрос был в увеличении нагрузки на сервер. Кто нить уже делал подобные ограничения и как это повлияло на работу?
...
Рейтинг: 0 / 0
05.03.2020, 11:15
    #39934520
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
mih.dim1
если в 1 сек могут добавиться около 100 тыс записей в каждую из таблиц?

Если добавляется 100 тысяч записей в секунду, то думать надо совсем о других вещах.
Или более 4 месяцев работы не требуется?
...
Рейтинг: 0 / 0
05.03.2020, 11:17
    #39934523
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
mih.dim1
Я так понимаю для полной уверенности что ничего не пересечется (мы отдадим систему на откуп заказчику через пару лет), чтобы кривые ручки их админа случайно напрямую не вставили значение или что то подобное, нужно еще и ограничения поставить?

вопрос только в том, а не создаст ли это существенную нагрузку на систему для проверки, если в 1 сек могут добавиться около 100 тыс записей в каждую из таблиц?
Конечно, нужно. Лучше в виде диапазонов between, для читаемости и расширения в будущем.
Нагрузку не создаст, они проверяются быстро.

Только будет проблема с балк-загрузкой с отключёнными чек-констрейнами. Если таковые загрузки есть. Тут нужно быть особенно внимательным.
Притом нельзя отключить только FK, можно только все чек- и форейн- констрейны. А проверять FK при балке - долго.
Да и вообще, по умолчанию констрейны не проверяются.
Так что, ещё раз, тут требуется повышенная внимательность - не давайте делать импорт джуниорам :-).
Alibek B.
А еще можно использовать отрицательные значения и декремент: identity(-1,-1).
Это вариант реализации разделения по диапазонам, только не такой удобный, с недостатками.
...
Рейтинг: 0 / 0
05.03.2020, 11:19
    #39934524
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
alexeyvg
Это вариант реализации разделения по диапазонам, только не такой удобный, с недостатками.

Если нужно разделить только на два сегмента, то такого способа может оказаться достаточно.
А иногда это даже бывает удобно.
...
Рейтинг: 0 / 0
05.03.2020, 11:24
    #39934528
andy st
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
mih.dim1,
Лучше в Tab1 добавить поле на справочник "юрик/физик/инопланетянин/.." и по нему разруливать
А то после Tab7/8/9 и Tab10/Tab11/Tab12 всё будет некрасиво выглядеть
...
Рейтинг: 0 / 0
05.03.2020, 11:26
    #39934530
mih.dim1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
Alibek B.
alexeyvg
Это вариант реализации разделения по диапазонам, только не такой удобный, с недостатками.

Если нужно разделить только на два сегмента, то такого способа может оказаться достаточно.
А иногда это даже бывает удобно.


Да только на 2 таблицы
...
Рейтинг: 0 / 0
05.03.2020, 11:35
    #39934537
mih.dim1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
andy st
mih.dim1,
Лучше в Tab1 добавить поле на справочник "юрик/физик/инопланетянин/.." и по нему разруливать
А то после Tab7/8/9 и Tab10/Tab11/Tab12 всё будет некрасиво выглядеть


проясню ситуацию:
Tab1 - сейчас для для физиков содержит 15 полей (int,bigint,varchar)
Если добавить в нее и хранение юриков, то нужно добавить еще 8 полей.
И получиться ситуация: 9 общих полей, 6 заполнены только для физиков, 8 только для юриков.

С Tab3 - всего 6 полей, из них общих для юриков и физиков только 1. Итог, если добавить все в одну структуру:
1 общее поле, 5 полей будет заполнено только для физиков, 7 полей только для юриков.

Поэтому и было принято решение делить на разные таблицы.

К тому же нужно и по доступу их потом делить.
...
Рейтинг: 0 / 0
05.03.2020, 11:44
    #39934551
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
mih.dim1
Alibek B.
пропущено...

Если нужно разделить только на два сегмента, то такого способа может оказаться достаточно.
А иногда это даже бывает удобно.

Да только на 2 таблицы
Неудобно.
Например, часто нужна сортировка по инкрементному ID, индексы будут по разному работать, в интерфейсе отрицательные ID будут мельтешить. Плюс будет привычка к проверке +-.
А если появится третья группа таблиц? Типа, третий поставщик, со своими ID? Или ещё какое то разделение...

Я бы делал диапазоны вообще с ведущей цифрой:
1000000000000 - первый диапазон
2000000000000 - втопрой диапазон
3000000000000 - ...
...
Они будут везде одинаково показываться, при этом по первой цифре можно видеть группу.
andy st
mih.dim1,
Лучше в Tab1 добавить поле на справочник "юрик/физик/инопланетянин/.." и по нему разруливать
А то после Tab7/8/9 и Tab10/Tab11/Tab12 всё будет некрасиво выглядеть
Конечно, но если стоит задача не ломать существующую систему? Особенно, если система покупная?
...
Рейтинг: 0 / 0
05.03.2020, 11:45
    #39934555
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
mih.dim1
проясню ситуацию:
Tab1 - сейчас для для физиков содержит 15 полей (int,bigint,varchar)
Если добавить в нее и хранение юриков, то нужно добавить еще 8 полей.
И получиться ситуация: 9 общих полей, 6 заполнены только для физиков, 8 только для юриков.

С Tab3 - всего 6 полей, из них общих для юриков и физиков только 1. Итог, если добавить все в одну структуру:
1 общее поле, 5 полей будет заполнено только для физиков, 7 полей только для юриков.
Для этого делают структуру:
Таблица с общими атрибутами
Таблицы расширенных атрибутов, со связкой 1-1 к главной.
...
Рейтинг: 0 / 0
05.03.2020, 11:45
    #39934557
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
mih.dim1,

Можно без деления на диапазоны и проверок. Примерно так
Код: sql
1.
2.
3.
4.
create table dbo.t1 (seq int identity, id as seq * 10 + 1 persisted not null, primary key (id));
create table dbo.t2 (seq int identity, id as seq * 10 + 2 persisted not null, primary key (id));

drop table dbo.t2, dbo.t1;
...
Рейтинг: 0 / 0
05.03.2020, 12:12
    #39934573
mih.dim1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
alexeyvg
mih.dim1
проясню ситуацию:
Tab1 - сейчас для для физиков содержит 15 полей (int,bigint,varchar)
Если добавить в нее и хранение юриков, то нужно добавить еще 8 полей.
И получиться ситуация: 9 общих полей, 6 заполнены только для физиков, 8 только для юриков.

С Tab3 - всего 6 полей, из них общих для юриков и физиков только 1. Итог, если добавить все в одну структуру:
1 общее поле, 5 полей будет заполнено только для физиков, 7 полей только для юриков.
Для этого делают структуру:
Таблица с общими атрибутами
Таблицы расширенных атрибутов, со связкой 1-1 к главной.


Да так хотели первоначально, но вариант не понравился тем что нужно много менять по существующим операциям (80% операций в системе), а также, разделяя на 2 таблицы, мы уменьшаем нагрузку на таблицу (TAb1 самая нагруженная по вставке данных).
...
Рейтинг: 0 / 0
05.03.2020, 12:18
    #39934579
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
mih.dim1
alexeyvg
пропущено...
Для этого делают структуру:
Таблица с общими атрибутами
Таблицы расширенных атрибутов, со связкой 1-1 к главной.


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

Только нужно помнить, что вам всё равно придётся программировать работу с новыми таблицами, так что над оценкой трудоёмкости этих 2х вариантов нужно ещё поработать.
...
Рейтинг: 0 / 0
05.03.2020, 16:53
    #39934795
mih.dim1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальный ключ на 2 таблицы.
alexeyvg
mih.dim1
пропущено...


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

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


Это ясно. Спасибо всем за помощь.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Уникальный ключ на 2 таблицы. / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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