powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование БД, двойной ключ.
20 сообщений из 20, страница 1 из 1
Проектирование БД, двойной ключ.
    #32308258
k0zt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, здрасти.
Подскажите, не допрёт до меня. В таблице адреса организации существуют 4 ключа(один составной): ИНН, ОКПО, ОКОНХ, {city_id, street_id, house_no, office_no} (каждый по одиночке уникально идентифицируют организацию). Это нормально?
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32308315
x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x
Гость
Нормально.
Только в реальной жизни (по нашей базе клиентов)
ни ИНН, ни ОКПО не являются уникальными (как ни странно)
Не говоря уже о том, что какие-то свередния не всегда известны
А потому обычно появляется пятый ключ - суррогатный
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32308322
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2k0zt
Я бы еще пятый добавил - ID, и сделал его первичным. 8-)

>В таблице адреса организации существуют 4 ключа
В смысле существуют уникальные индексы по этим полям? А как ты борешься с отсутствием информации по любому из полей? Если с ИНН, ОКПО, ОКОНХ более менее понятно - они ДОЛЖНЫ быть, то с (city_id, street_id, house_no, office_no) не особо. Вдруг номера офиса (например) не существует в природе.
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32308334
Фотография Владимир П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы в качестве ключа использовали поле NICKNAME varchar(около 30) . Это псевдоним, его выбирает оператор так, чтобы ему было удобно идентифицировать сущность. Потом этот псевдоним показывается во всех detail-таблицах; а объявляя его внешним ключем, мы избавляемся от JOIN'ов. (мы суррогатных ключей стараемся избегать).
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32308337
Oleg_Martynov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОКОНХ - может поменяться (кстати, с 01.01.2003 его нет, теперь ОКВЭД), к тому же у одной конторы их может быть несколько.
Адрес - контора может переехать
ИНН, ОКПО - а если будет кампания по смене (вроде, уже была как-то раз по ОКПО, хотя могу ошибаться).
Т.е., видимо, всё же по рекомендации х - без суррогатного ключа, видимо, не обойтись.
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32308339
Oleg_Martynov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и один код ОКОНХ (или ОКВЭД) может соответствовать нескольким организациям. Например, у продуктовых ларьков, наверное, одинаковый ОКНХ (ОКВЭД).
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32308461
Фотография Владимир П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_Martynov, на случай изменения ключевых полей существуют каскадные update'ы. Могут реализовываться триггерами или фразой ON UPDATE CASCADE в объявлении внешнего ключа. Поскольку такие изменения в реальной жизни очень редки -- я считаю, что изменения ключевых атрибутов не нужно бояться.
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32308492
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Владимир П.
>Поскольку такие изменения в реальной жизни очень редки -- я считаю, что изменения ключевых атрибутов не нужно бояться.
А по моему этого стоит бояться именно по той же причине. На частые ситуации и реакция в базе/программе отлажена лучше. А тут... А вдруг тот тригер был деактивирован в то время по какой то причине.
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32308501
Oleg_Martynov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Владимир П.
Ну конечно, Вы правы. Хотя я, например, предпочитаю суррогатные ключи - но это скорее дело вкуса, не один уже раз был спор на эту тему.
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32308709
Фотография Владимир П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серега!

А вдруг тот тригер был деактивирован в то время по какой то причине

Но constraint на ссылочную целостность у нас же есть. Если триггер не сработает, получим попытку нарушения, большой-большой rollback, сообщение в окошке, а база останется в согласованном состоянии.
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32308931
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мало того, что ОКВЭД/ОКОНХ и ОКПО могут совпадать, и они и ИНН могут быть неизвестны в момент ввода. Для филиалов ИНН может совпадать (отличаются по КПП). И все эти параметры могут менятся.
И кстати, непонятно, какое отношение имеет напр. ИНН или классификатор внешнеэконм. деятельности к адресу?

И напоследок, нафига такой "разобранный" (отдельно дом, улица и пр.) адрес?
Nobody faults but mine... (LZ)
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32309776
Репликант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир П.:
Мы в качестве ключа использовали поле NICKNAME varchar(около 30). Это псевдоним, его выбирает оператор так, чтобы ему было удобно идентифицировать сущность.

А оператор в этом случае не замучается выдумывать уникальный NICKNAME, если сущностей много? Если сущность - это организация или физическое лицо, то почему бы в той же программе оператору не идентифицировать сущность по наименованию/ФИО + № гос.регистрации

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

А почему вы избегаете суррогатных, если не секрет? Я, например, всегда использую суррогатные ключи по причине производительности, но может за исключением тех случаев, когда существует натуральный ключ вроде инвентарного номера, артикула или другого числового ИД
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32309835
Фотография Владимир П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А оператор в этом случае не замучается выдумывать уникальный NICKNAME

Вряд ли. Если, увидев "Жиртрест", ему сразу понятно, о ком речь, то зачем ему длинная фраза "ОАО НПП Жиртрест-98 тыры-пыры... города такого-то"?

А вообще, смотря что АСУчивать. Для мелких, например, компьютерных сборщиков, такой подход годится. Для крупных заказчиков может подойти другое.

А почему вы избегаете суррогатных, если не секрет?

По причине производительности.
Если предметная область требует уникальности естественного ключа, то уникальность нужно будет вводить в базу, наряду с уникальностью суррогатного ключа. Т.е. 2 индекса вместо одного.
Другую причину уже упоминал -- естественный ключ показывается в detail-таблицах в качестве поля самой detail-таблицы; мы избавляемся от JOIN'ов.

А также см. статью А.Усова "Ключ или отмычка".
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32310035
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Владимир П.

Самое противное в естественных ключях, что они могут меняться и даже исчезать/появляться "по решению партии и правительства" в одночасье. Уберут завтра ИНН и введут СуперИНН - и что?

Хотя конечно в чем то вы правы.
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32310301
Фотография Владимир П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оставим как было и будем считать его суррогатным ;-)

Другой подход. Предположим, убрали ИНН. По этому поводу нужно поменять или уничтожить все старые документы? Нет, имеющиеся документы нужны в неизменном виде. Значит, оставляем поля для истории.

Самое правильное, конечно, перестройка constraint'ов на новые реалии.
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32310317
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Усова "Ключ или отмычка".

Скажем, очень похоже на бред
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32310522
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть в чем-то схожая проблема. А именно, есть клиентская база.
Клиенты м.б. как юрлица, так и физлица, а также ПБОЮЛ и кредитные ор-ции. Во всех случаях наборы реквизитов отличаются.
Ключ - разумеется, суррогатный, напр. objectID
Проблема заключается в определении уникальности клиента. Во-первых, для разных типов клиентов она определяется по-разному. Например, у ф/л ИНН как правило нет (точнее, они его не знают). Во-вторых в момент ввода в базу часть ревизитов - даже обязательных, таких как ИНН для юрлица, может быть неизвестна. В-третьих, ревизиты иногда меняются. В силу чего есть сложная процедра определения уникальности по сочетании реквизитов. К сожалению, гарантировать уникальность в принципе невозможно, можно только снизить возможность появления дублирующихся клиентов.

NICKNAME тоже есть, как обязательное и уникальное поле, но он уникальность обеспечить не может. NICKNAME - это только NICKNАME и есть, удобство поиска, и ничего больше. Взяли и сделали два "ОАО НПП Жиртрест-98 тыры-пыры... " под разными никами. И трындец.



Nobody faults but mine... (LZ)
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32311172
Фотография Владимир П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NICKNAME тоже есть, как обязательное и уникально е поле, но он уникальность обеспечить не может .

Это как???
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32311231
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Владимир П.
Другой подход. Предположим, убрали ИНН. По этому поводу нужно поменять или уничтожить все старые документы? Нет, имеющиеся документы нужны в неизменном виде. Значит, оставляем поля для истории.

Самое правильное, конечно, перестройка constraint'ов на новые реалии.

Ну ты же сам себе противоречишь.
Допустим есть таблица с 1000 клиентов и ИНН. Завтра - бабах - ИНН отменили, ввели СуперИНН. Для старой 1000 этого реквизита нет, и возможно никогда уже не будет(самой фирмы нет уже). Для вновь вводимых нет старого атрибута. Какие констрейнты тут помогут?
...
Рейтинг: 0 / 0
Проектирование БД, двойной ключ.
    #32311765
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NICKNAME можно сделать уникальным ключем - но, поскольку он вводится руками, он не может обеспечить уникальность клиентов. Т.е., как уже обьяснял, можно ввести два раза одного и того же клиента под разными nickname.

Nobody faults but mine... (LZ)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование БД, двойной ключ.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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