|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
Народ, здрасти. Подскажите, не допрёт до меня. В таблице адреса организации существуют 4 ключа(один составной): ИНН, ОКПО, ОКОНХ, {city_id, street_id, house_no, office_no} (каждый по одиночке уникально идентифицируют организацию). Это нормально? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 08:06 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
Нормально. Только в реальной жизни (по нашей базе клиентов) ни ИНН, ни ОКПО не являются уникальными (как ни странно) Не говоря уже о том, что какие-то свередния не всегда известны А потому обычно появляется пятый ключ - суррогатный ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 09:30 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
2k0zt Я бы еще пятый добавил - ID, и сделал его первичным. 8-) >В таблице адреса организации существуют 4 ключа В смысле существуют уникальные индексы по этим полям? А как ты борешься с отсутствием информации по любому из полей? Если с ИНН, ОКПО, ОКОНХ более менее понятно - они ДОЛЖНЫ быть, то с (city_id, street_id, house_no, office_no) не особо. Вдруг номера офиса (например) не существует в природе. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 09:36 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
Мы в качестве ключа использовали поле NICKNAME varchar(около 30) . Это псевдоним, его выбирает оператор так, чтобы ему было удобно идентифицировать сущность. Потом этот псевдоним показывается во всех detail-таблицах; а объявляя его внешним ключем, мы избавляемся от JOIN'ов. (мы суррогатных ключей стараемся избегать). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 09:44 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
ОКОНХ - может поменяться (кстати, с 01.01.2003 его нет, теперь ОКВЭД), к тому же у одной конторы их может быть несколько. Адрес - контора может переехать ИНН, ОКПО - а если будет кампания по смене (вроде, уже была как-то раз по ОКПО, хотя могу ошибаться). Т.е., видимо, всё же по рекомендации х - без суррогатного ключа, видимо, не обойтись. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 09:47 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
Да, и один код ОКОНХ (или ОКВЭД) может соответствовать нескольким организациям. Например, у продуктовых ларьков, наверное, одинаковый ОКНХ (ОКВЭД). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 09:50 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
Oleg_Martynov, на случай изменения ключевых полей существуют каскадные update'ы. Могут реализовываться триггерами или фразой ON UPDATE CASCADE в объявлении внешнего ключа. Поскольку такие изменения в реальной жизни очень редки -- я считаю, что изменения ключевых атрибутов не нужно бояться. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 10:44 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
2Владимир П. >Поскольку такие изменения в реальной жизни очень редки -- я считаю, что изменения ключевых атрибутов не нужно бояться. А по моему этого стоит бояться именно по той же причине. На частые ситуации и реакция в базе/программе отлажена лучше. А тут... А вдруг тот тригер был деактивирован в то время по какой то причине. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 10:57 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
2Владимир П. Ну конечно, Вы правы. Хотя я, например, предпочитаю суррогатные ключи - но это скорее дело вкуса, не один уже раз был спор на эту тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 11:02 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
Серега! А вдруг тот тригер был деактивирован в то время по какой то причине Но constraint на ссылочную целостность у нас же есть. Если триггер не сработает, получим попытку нарушения, большой-большой rollback, сообщение в окошке, а база останется в согласованном состоянии. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 12:25 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
Мало того, что ОКВЭД/ОКОНХ и ОКПО могут совпадать, и они и ИНН могут быть неизвестны в момент ввода. Для филиалов ИНН может совпадать (отличаются по КПП). И все эти параметры могут менятся. И кстати, непонятно, какое отношение имеет напр. ИНН или классификатор внешнеэконм. деятельности к адресу? И напоследок, нафига такой "разобранный" (отдельно дом, улица и пр.) адрес? Nobody faults but mine... (LZ) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2003, 14:01 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
2 Владимир П.: Мы в качестве ключа использовали поле NICKNAME varchar(около 30). Это псевдоним, его выбирает оператор так, чтобы ему было удобно идентифицировать сущность. А оператор в этом случае не замучается выдумывать уникальный NICKNAME, если сущностей много? Если сущность - это организация или физическое лицо, то почему бы в той же программе оператору не идентифицировать сущность по наименованию/ФИО + № гос.регистрации Потом этот псевдоним показывается во всех detail-таблицах; а объявляя его внешним ключем, мы избавляемся от JOIN'ов. (мы суррогатных ключей стараемся избегать). А почему вы избегаете суррогатных, если не секрет? Я, например, всегда использую суррогатные ключи по причине производительности, но может за исключением тех случаев, когда существует натуральный ключ вроде инвентарного номера, артикула или другого числового ИД ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2003, 09:00 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
А оператор в этом случае не замучается выдумывать уникальный NICKNAME Вряд ли. Если, увидев "Жиртрест", ему сразу понятно, о ком речь, то зачем ему длинная фраза "ОАО НПП Жиртрест-98 тыры-пыры... города такого-то"? А вообще, смотря что АСУчивать. Для мелких, например, компьютерных сборщиков, такой подход годится. Для крупных заказчиков может подойти другое. А почему вы избегаете суррогатных, если не секрет? По причине производительности. Если предметная область требует уникальности естественного ключа, то уникальность нужно будет вводить в базу, наряду с уникальностью суррогатного ключа. Т.е. 2 индекса вместо одного. Другую причину уже упоминал -- естественный ключ показывается в detail-таблицах в качестве поля самой detail-таблицы; мы избавляемся от JOIN'ов. А также см. статью А.Усова "Ключ или отмычка". ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2003, 09:56 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
2Владимир П. Самое противное в естественных ключях, что они могут меняться и даже исчезать/появляться "по решению партии и правительства" в одночасье. Уберут завтра ИНН и введут СуперИНН - и что? Хотя конечно в чем то вы правы. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2003, 11:33 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
Оставим как было и будем считать его суррогатным ;-) Другой подход. Предположим, убрали ИНН. По этому поводу нужно поменять или уничтожить все старые документы? Нет, имеющиеся документы нужны в неизменном виде. Значит, оставляем поля для истории. Самое правильное, конечно, перестройка constraint'ов на новые реалии. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2003, 13:39 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
А.Усова "Ключ или отмычка". Скажем, очень похоже на бред ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2003, 13:44 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
У меня есть в чем-то схожая проблема. А именно, есть клиентская база. Клиенты м.б. как юрлица, так и физлица, а также ПБОЮЛ и кредитные ор-ции. Во всех случаях наборы реквизитов отличаются. Ключ - разумеется, суррогатный, напр. objectID Проблема заключается в определении уникальности клиента. Во-первых, для разных типов клиентов она определяется по-разному. Например, у ф/л ИНН как правило нет (точнее, они его не знают). Во-вторых в момент ввода в базу часть ревизитов - даже обязательных, таких как ИНН для юрлица, может быть неизвестна. В-третьих, ревизиты иногда меняются. В силу чего есть сложная процедра определения уникальности по сочетании реквизитов. К сожалению, гарантировать уникальность в принципе невозможно, можно только снизить возможность появления дублирующихся клиентов. NICKNAME тоже есть, как обязательное и уникальное поле, но он уникальность обеспечить не может. NICKNAME - это только NICKNАME и есть, удобство поиска, и ничего больше. Взяли и сделали два "ОАО НПП Жиртрест-98 тыры-пыры... " под разными никами. И трындец. Nobody faults but mine... (LZ) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2003, 15:03 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
NICKNAME тоже есть, как обязательное и уникально е поле, но он уникальность обеспечить не может . Это как??? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2003, 06:44 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
2Владимир П. Другой подход. Предположим, убрали ИНН. По этому поводу нужно поменять или уничтожить все старые документы? Нет, имеющиеся документы нужны в неизменном виде. Значит, оставляем поля для истории. Самое правильное, конечно, перестройка constraint'ов на новые реалии. Ну ты же сам себе противоречишь. Допустим есть таблица с 1000 клиентов и ИНН. Завтра - бабах - ИНН отменили, ввели СуперИНН. Для старой 1000 этого реквизита нет, и возможно никогда уже не будет(самой фирмы нет уже). Для вновь вводимых нет старого атрибута. Какие констрейнты тут помогут? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2003, 09:16 |
|
Проектирование БД, двойной ключ.
|
|||
---|---|---|---|
#18+
NICKNAME можно сделать уникальным ключем - но, поскольку он вводится руками, он не может обеспечить уникальность клиентов. Т.е., как уже обьяснял, можно ввести два раза одного и того же клиента под разными nickname. Nobody faults but mine... (LZ) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2003, 13:34 |
|
|
start [/forum/topic.php?fid=32&msg=32308461&tid=1546782]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
174ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 238ms |
total: | 520ms |
0 / 0 |