powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выбор PK
21 сообщений из 46, страница 2 из 2
Выбор PK
    #33217955
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделайте так:

В пределах одного филиала ключ интовый идентити, а в в межфилиальном пространстве uniqueidentifier соответствующий интовому. И будет Вам счастье.
...
Рейтинг: 0 / 0
Выбор PK
    #33217967
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИ вообще сыр-бор как я понимаю только из-за того, что кто-то очень хочет писать
update/delete... where id=:id
вместо
update/delete .... where (division_id,id)=(:division_id,:id)

потому, что в первом варианте короче?
мне надоели эти выпады. А если предположить некое интранет/интернет приложение, которое выводит строки из БД, для последующей модификации/удаления. Самый простой способ - это передать единственный параметр, уникально определяющий запись, чем массив параметров. В большом приложении - это становится настоящей проблемой отслеживать такие вещи. Или вы против того, что чем проще механизм тем он надежнее?

авторСдается мне что причина вообще несколько в другом. У MSSQL имеется только IDENTITY поле, которое обязательно подразумемает индекс. У того же Оракла и ДБ2 есть SEQUENCE. (У ДБ2 есть и IDENTITY тоже в дополнение к SEQUENCE).
Соответственно и подходы диктуются используемым сервером БД.
вряд ли используемый сервер здесь имеет значение. хотя может быть именно отсутствие SEQUENCE для AS/400 и побудило нашу команду использовать IDENTITY и проч? или всё таки удобство?
...
Рейтинг: 0 / 0
Выбор PK
    #33217971
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanПреписывать селекты?... хм.. что-то я сомневаюсь что это нужно будет делать.
Давайте смотреть. Две таблицы, СОТРУДНИКИ и ЗАРПЛАТЫ. Сделали alter table, добавили в каждую поле "филиал". Выполняем запрос:

Код: plaintext
1.
select с.имя_сотрудника, з.величина_зарплаты
from Сотрудники c join Зарплата з on (c.ид_сотрудника = з.ид_сотрудника)

Внимание, вопрос: куда меня пошлет бухгалтер, когда я потребую у него все приписанные мне зарплаты?
...
Рейтинг: 0 / 0
Выбор PK
    #33217995
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вопросик можно?
Вы в какой базе этот запрос делаете?
В базе филиала или в консолидированной базе?
Если в базе филиала - то никаких проблем.
А если в консолидированной - это ее проблемы :))
...
Рейтинг: 0 / 0
Выбор PK
    #33218009
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА вопросик можно?
Вы в какой базе этот запрос делаете?
В базе филиала или в консолидированной базе?
Если в базе филиала - то никаких проблем.
А если в консолидированной - это ее проблемы :))

а какие могут быть проблемы в консолидированной? Селективность у уникального индекса куда как очень хорошая. Так ведь? Или о чем вы?
...
Рейтинг: 0 / 0
Выбор PK
    #33218013
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Гости
На счет AS/400 не знаю. Знаю на счет DB2UDB - на самом деле там IDENTITY нет. Есть только SQUENCE. Для каждого поля IDENTITY неявно создается свой SEQUENCE. Это все видно в представлениях каталога.
А написать свою функцию на C, которая раздавала бы IDENTITY ничего не стоит. Было бы желание. :)
...
Рейтинг: 0 / 0
Выбор PK
    #33218026
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanА если у филиалов вдруг пересекаются диапазоны - вот тогда это действительно круто...
Если - как предложил мой собеседник - задача стартует с "независимо установленных систем", в ней на 100% будут коллизии в id-шниках. Если диапазоны изначально удерживаются различными - собственно, имеем вполне нормальную ситуацию с identity, нет никаких причин делать составной ключ. Почему нет? Давайте ограничимся индексами. Итак, изначально есть индекс

PK:(table_id)

С введением понятия филиала добавляются потенциальные индексы:

AK:(table_id, division_id)
AK:(division_id, table_id)

Первый из них почти бессмысленен, хорош только тем, что запрос вида

Код: plaintext
select division_id from table where table_id = :table_id

выполнится несколько быстрее. Второй - вообще бессмысленен за исключением разве что некоторых order by-ев.
...
Рейтинг: 0 / 0
Выбор PK
    #33218038
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanА если в консолидированной - это ее проблемы
Тогда не понимаю, почему Вы сами не ответили на собственный вопрос "как в таком случае сделать группировку по филиалам". Ровно этими же словами.

Правда, если мне доведется заказывать софт на стороне, я предпочту исполнителя, не имеющего привычки отвечать "это ваши проблемы". Нехай он сидит со своими составными ключами, а я куплю работающую систему.
...
Рейтинг: 0 / 0
Выбор PK
    #33218129
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> У каждого из серверов PK - это identity с определенной областью
> значений, которая не перекрывается PK других серверов.

Откуда уверенность, что они не перекрываются? Каковы правила раздачи диапазонов? Каковый правила выделения диапазонов при добавлении серверов? Каковы правила выделения диапазонов при необходимости деления филиалов?
...
Рейтинг: 0 / 0
Выбор PK
    #33218468
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОткуда уверенность, что они не перекрываются? Каковы правила раздачи диапазонов? Каковый правила выделения диапазонов при добавлении серверов? Каковы правила выделения диапазонов при необходимости деления филиалов?
а это что за подозрения такие и как они относятся к теме дискуссии?
Посмотрите, хотя бы пример софтварера - есть сомнения, что значения выйдут за диапазон? Я тоже уверен, что у нас они всегда будут уникальны для всей системы в целом.
...
Рейтинг: 0 / 0
Выбор PK
    #33218587
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> а это что за подозрения такие и как они относятся к теме дискуссии?

Я читаю первое (Ваше) сообщение этого треда. Вижу описание примера, которое на мой взгляд, является типично кривым. Т. е. "выбор identity field в качестве PK - кривое решение" - ответ нет. А вот Ваш пример - это пример кривого решения. Отсюда и вопросы.

> Посмотрите, хотя бы пример софтварера - есть сомнения, что значения
> выйдут за диапазон?

Чего пример, простите? Что мне этот пример должен объяснить?

> Я тоже уверен, что у нас они всегда будут уникальны для всей
> системы в целом.

Я и прошу поделиться Вашей уверенностью. На чем-то ведь она основана, правда? Вопросы - сообщением выше.
...
Рейтинг: 0 / 0
Выбор PK
    #33218628
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ читаю первое (Ваше) сообщение этого треда. Вижу описание примера, которое на мой взгляд, является типично кривым. Т. е. "выбор identity field в качестве PK - кривое решение" - ответ нет. А вот Ваш пример - это пример кривого решения. Отсюда и вопросы.


identitiy генерится через одну таблицу, затем префиксуется/постфиксуется условным кодом области, полученное id используется в кач-ве первичного ключа в остальных документах БД. Это решение сильно кривое?

авторЧего пример, простите? Что мне этот пример должен объяснить?

softwarercreate sequence S minvalue 1000 maxvalue 2000 - эта конструкция достаточно однозначна - значения не выходят за диапазон.
...
Рейтинг: 0 / 0
Выбор PK
    #33218716
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Это решение сильно кривое?

Смотря с чем сравнивать.

> identitiy генерится через одну таблицу, затем префиксуется/постфиксуется
> условным кодом области, полученное id используется в кач-ве первичного ключа
> в остальных документах БД.

Т. е. условный код добавляется в начало первичного ключа и в конец (префикс + id + суффикс; префикс = суффиксу), так? Каков размер первичного ключа? Что Вы собираетесь делать при необходимости описывать филиалы филиалов?

> create sequence S minvalue 1000 maxvalue 2000 - эта конструкция достаточно
> однозначна - значения не выходят за диапазон.

Это понятно. А почему Вы считаете, что заявленного диапазона Вам должно хватить (причем, в сильно урезанном виде из-за алгоритма формирования первичного ключа)?
...
Рейтинг: 0 / 0
Выбор PK
    #33218822
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСмотря с чем сравнивать.
а че его сравнивать, для задачи, которая у нас есть - это было самым оптимальным решением.

авторТ. е. условный код добавляется в начало первичного ключа и в конец (префикс + id + суффикс; префикс = суффиксу), так? Каков размер первичного ключа? Что Вы собираетесь делать при необходимости описывать филиалы филиалов?

префикс ИЛИ суффикс - у нас префикс. Некоторые делают суффикс - это не имеет значения. размер первичного ключа - integer+2 символа префикса. филиалы филиалов (даже если они будут, что вряд ли :) ) получат свой префикс вот и все.

авторЭто понятно. А почему Вы считаете, что заявленного диапазона Вам должно хватить (причем, в сильно урезанном виде из-за алгоритма формирования первичного ключа)?
в нашем случае диапазон иссякнет не очень скоро. сколько там под интегер отведено? кажется 4 байта, + 2 байта префикс даже при нынешней нагрузке (5000 записей в день) - этого хватит надолго
...
Рейтинг: 0 / 0
Выбор PK
    #33218847
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanПреписывать селекты?... хм.. что-то я сомневаюсь что это нужно будет делать.
ALTER TABLE - может и придется сделать а вот переписывать селекты - зачем?

А если у филиалов вдруг пересекаются диапазоны - вот тогда это действительно круто...
Можно ввести корпоративный Identity и пусть филиалы при помощи него между собой и "старшим братом" сношаются
ЗЫ
Филиалы его(corpo_identity) почитывают, а старший брат пописывает
...
Рейтинг: 0 / 0
Выбор PK
    #33218870
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще, на каждом уровне должен быть свой, самостоятельный(для уровня) identity
...
Рейтинг: 0 / 0
Выбор PK
    #33219017
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> для задачи, которая у нас есть - это было самым оптимальным решением.

Если Вы говорите "оптимальным", было бы правильно приводить при этом критерии оптимальности. Абстрактно оптимальных решений не бывает.

> размер первичного ключа - integer+2 символа префикса.

А храните Вы его как? В виде текста?

> филиалы филиалов (даже если они будут, что вряд ли :) ) получат свой
> префикс вот и все.

Т. о., количество ваших филиалов ограничено 100. Так и был задумано? Т. е. 101-й не появится ни при каких обстоятельствах?

> (5000 записей в день) - этого хватит надолго

Что мешает этой нагрузке измениться?
...
Рейтинг: 0 / 0
Выбор PK
    #33221055
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621Что мешает этой нагрузке измениться?
Что, впрочем, не вызовет никаких проблем. Из общих соображений я предпочитаю конструкцию

Код: plaintext
create sequence S start with <номер_филиала> increment by  1000 

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

Тем не менее, и с указанной конструкцией особых проблем нет - нужно только повесить job, который будет выполнять

Код: plaintext
1.
2.
SQL> select sequence_owner, sequence_name
   2   from dba_sequences
   3   where cycle_flag = 'Y' and max_value - last_number < :N

и сообщать админу о том, что скоро потребуется выделить новый диапазон.
...
Рейтинг: 0 / 0
Выбор PK
    #33222135
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> она более независима

Это иллюзия.

> магическую константу

Плохо это - использовать такие константы. Мало того, что теоретически коряво, еще и практически не нужно.

> Нагрузка может измениться на порядок-другой, а вот с филиалами это маловероятно

Нагрузка может измениться как угодно. Сделали приложение более функциональным - она и выросла. А что имеем вместо полноценного int4? И зачем?

Кстати, если какой-нибудь местнофилиальный умелец вместо <номер_филиала> определит в sequence <номер_филиала>+n = <номер_другого_филиала>, - не страшно потом это разгребать?

> нужно только повесить job, который будет выполнять

Т. е. костыли нужно снабдить подпорками?
...
Рейтинг: 0 / 0
Выбор PK
    #33222652
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621 Т. е. костыли нужно снабдить подпорками?аффтар жжодЪ! пеши етсчо
...
Рейтинг: 0 / 0
Выбор PK
    #33222772
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_20040621Это иллюзия.
Другого я бы попросил развеять ее. Но учитывая, в какое количество бессмысленного трепа выливается такая просьба в Вашем случае, воздержусь.
...
Рейтинг: 0 / 0
21 сообщений из 46, страница 2 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выбор PK
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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