|
|
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
Поискал и почитал сдешние посты по проектированию, но своей проблемой не разобрался. Прошу совета у опытных. Есть производство приборов. Прибор четко характеризуется 2 параметрами - серийником и типом прибора. Пока есть 2 варианта для ключей 1. device( serial , device_typeid , ...) - составной 2. device( deviceid , serial, device_typeid, ...) - один суррогатный Выбор между ними сделать не могу. Недостатки первого:. 1. серийник текстовый и длинный - тормоза с запросами - в некоторых случаях раза в 3-4 медленнее, чем при числовом поле. 2. некоторые проблемы при реализации клиентской части - при добавлении в базу уже существующего прибора пользователи хотят в разном порядке забивать параметры прибора (а за прибор отвечает несколько таблиц - эксклюзивные подкатегории или как там их) Недостатки второго: 1. Нарушение 4-ой нормальной формы - не получается в отношениях многие-ко-многим обеспечивать уникальность комбинаций силами MS SQL (через ограничения внешнего ключа) - нужно все проверять триггерами - а таких ситуаций и очень много и ощущение кривизны от такого подхода сильное. пример нарушение 4-ой нф че делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 10:08 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
проектант - бедолагаче делать? Прежде всего, долго думать... А нужно ли Вам в данном конкретном случае соблюдать 4НФ. Может быть все-таки хватит 3НФ? проектант - бедолагаПоискал и почитал сдешние посты по проектированию, но своей проблемой не разобрался. Прошу совета у опытных. Есть производство приборов. Прибор четко характеризуется 2 параметрами - серийником и типом прибора. Пока есть 2 варианта для ключей 1. device( serial , device_typeid , ...) - составной 2. device( deviceid , serial, device_typeid, ...) - один суррогатный Выбор между ними сделать не могу. Недостатки первого:. 1. серийник текстовый и длинный - тормоза с запросами - в некоторых случаях раза в 3-4 медленнее, чем при числовом поле. 2. некоторые проблемы при реализации клиентской части - при добавлении в базу уже существующего прибора пользователи хотят в разном порядке забивать параметры прибора (а за прибор отвечает несколько таблиц - эксклюзивные подкатегории или как там их) Недостатки второго: 1. Нарушение 4-ой нормальной формы - не получается в отношениях многие-ко-многим обеспечивать уникальность комбинаций силами MS SQL (через ограничения внешнего ключа) - нужно все проверять триггерами - а таких ситуаций и очень много и ощущение кривизны от такого подхода сильное. пример нарушение 4-ой нф ИМХО, сама-по-себе проблема не понятна. Надо бы все рассмотреть в комплексе. Если данные из таблицы Device попадают, например, в счет клиенту, или в накладную, или Вы печатаете гарантийный талон, или..., то я бы предпочел бы иметь один уникальный deviceid . Если просто нужны для архива и поиска данных, то, ИМХО, без разницы... Кроме того вопрос: а Вы что же, данные сразу кидаете в таблицу? Не ожидаете конца ввода пользователем данных? Что-то я проблему 2 первого варианта не до конца понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 10:46 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
Хм. Скажем так, лично я естественные ключи не люблю куда больше, нежели другие описанные Вами недостатки. Другие недостатки можно исправлять/компенсировать/обходить, а вот проблема "полгода назад мы опечатались, когда вводили серийник" никогда и никуда не уйдет, даже со сканнерами штрихкодов и прочей автоматизацией. Наиболее популярный вариант решения в Вашей ситуации - делать модификацию данных только через хранимые процедуры, в которых и осуществлять необходимые проверки целостности. Альтернативный вариант, который можно рассмотреть - вынести серийники в отдельную таблицу, а ключ делать по (serial_id, type_id). Это позволит довольно дешево делать нужный Вам контроль целостности на уровне FK. Но несмотря на своеобразную красоту таких вот разделяемых полей FK, этот подход склонен.. накапливать неудобства, что ли, поэтому я использую его только тогда, когда знаю, что мне таким образом надо спроектировать немногочисленную группу таблиц, и эта группа не начнет стремительно разрастаться при последующих доработках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 11:00 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
2 Станислав С в данном случае, составной ключ очень "в кассу". слишком много случаев отношений многие-ко-многим (производственные операции, диагностика, ремонты), которые зависят от типа прибора и если использовать один суррогатный ключ, то можно навводить в базу массу нелогичных комбинаций - все это придется контролировать триггерами. по поводу проблемы 2 второго варианта - клиент к базе пишется на Access - там есть некоторые свои особенности, которые во многих случаях упрощают жизнь, а в некоторых - наоборот. кроме того, ситуация в действительности чуть сложнее - к приборам есть комплектующие, используются эксклюзивные подкатегории и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 11:04 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
softwarerХм. Скажем так, лично я естественные ключи не люблю куда больше, нежели другие описанные Вами недостатки. Другие недостатки можно исправлять/компенсировать/обходить, а вот проблема "полгода назад мы опечатались, когда вводили серийник" никогда и никуда не уйдет, даже со сканнерами штрихкодов и прочей автоматизацией. согласен, что естественные ключи - не очень здорово и применять их стоит только в очень редких случаях. но, скажем, в MS SQL при установке связей можно указать опцию "Cascade Update Related Fields" - и проблема "полгода назад мы опечатались, когда вводили серийник" решается дешево силами сервера бд. softwarerАльтернативный вариант, который можно рассмотреть - вынести серийники в отдельную таблицу, а ключ делать по (serial_id, type_id). Это позволит довольно дешево делать нужный Вам контроль целостности на уровне FK. Но несмотря на своеобразную красоту таких вот разделяемых полей FK, этот подход склонен.. накапливать неудобства, что ли, поэтому я использую его только тогда, когда знаю, что мне таким образом надо спроектировать немногочисленную группу таблиц, и эта группа не начнет стремительно разрастаться при последующих доработках. тоже задумался над этим и тоже есть свои недостатки - не сходятся ежики :( спасибо, буду думать дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 11:20 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
проектант - бедолагаи проблема "полгода назад мы опечатались, когда вводили серийник" решается дешево силами сервера бд. Это если каскадный апдейт сумеет выполниться. С накоплением информации может нарасти такое дерево, что для изменения придется либо ждать ночи, либо выгонять пользователей. проектант - бедолагатоже задумался над этим и тоже есть свои недостатки - не сходятся ежики :( Не понимаю, как они могут не сойтись, если сходятся в оригинальной постановке. Пожалуй даже готов математически доказать, что такого не может быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 11:32 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
softwarer Это если каскадный апдейт сумеет выполниться. С накоплением информации может нарасти такое дерево, что для изменения придется либо ждать ночи, либо выгонять пользователей. да, может быть такое. но именно эта проблема, на мой взгляд, обходима - не смертельна. softwarerНе понимаю, как они могут не сойтись, если сходятся в оригинальной постановке. Пожалуй даже готов математически доказать, что такого не может быть. про ежиков имелось ввиду, что "подход склонен.. накапливать неудобства" :) но этот, альтернативный вариант, по-моему, наименее затратный. плюс сделать один триггер на добавление/обновление записей в device_serial, что-бы исключить ситуацию, когда для одного типа прибора есть 2 одинаковых серийника. контроль целостности хочется обеспечить за счет бд не только из-за того, что нужно будет делать меньше работы, но и сделать приложении наиболее надежным - если делать еще массу триггеров или хранимок - больше вероятность появления сделанной и пропущенной при тестах ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 12:14 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
БОльшую часть ограничений целостности все равно декларативно задать не удастся. Тот же ФК - лишь частный случай ограничения "Быть подмножеством", каковых в реальности нужно котролировать гораздо больше чем умеют СУБД. Печально, но факт. Кстати, а контролировать уникальность (serial, device_typeid) все равно ведь надо, даже при суррогатном ПК? Так что можно воспользоваться этим уникальным ключом и кое где навесить ФК на него, а не на ПК. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 20:17 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
З.Ы. В том примере про 4НФ нет нарушений. НФ проверяются только унутри отношений. Набор отношений должен проверяться на ограничения уровня БД в целом типа IDXS(#IDX_NAME, TAB_NAME) KEYS(#IDX_NAME, #COL_NAME) ( IDXS join KEYS ) [TAB_NAME,COL_NAME] is subset of COLS Что СУБД должно было быть бы ФК для вьюшки. доживем наверно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 20:30 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
> Есть производство приборов. > Прибор четко характеризуется 2 параметрами - серийником и типом прибора. Видимо, следует читать так: _изготовленный_ прибор... далее по тексту? Серийный номер - некая уникальная последовательность? Или имеет какие-то функциональные зависимости? К чему вопросы: Ваша постановка задачи недостаточна для выбора структуры данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2006, 22:55 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
> Видимо, следует читать так: _изготовленный_ прибор... далее по тексту? да. но при добавлении прибора в производство серийник присваивается базой автоматом. > Серийный номер - некая уникальная последовательность? Или имеет какие-то функциональные зависимости? в общем случае для каждого типа прибора - нумерация от 1 и дальше, плюс буквы. у приборов разных типов может быть одинаковый серийник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2006, 10:12 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
> но при добавлении прибора в производство серийник присваивается базой > автоматом. Понятно. > в общем случае для каждого типа прибора - нумерация от 1 и дальше, плюс > буквы. у приборов разных типов может быть одинаковый серийник. Т. е. Вы посчитали достаточной уникальность (serial, device_typeid). Imho абсолютно напрасно, поскольку с уникальным серийным номером схема была бы гораздо проще и правильнее. Ответ на Ваш вопрос: если делать "в лоб", то суррогатный ключ, отмеченный как вариант 2. Но на Вашем месте я бы переделал структуру данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2006, 11:18 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
guest_20040621Т. е. Вы посчитали достаточной уникальность (serial, device_typeid). Imho абсолютно напрасно, поскольку с уникальным серийным номером схема была бы гораздо проще и правильнее. это не я посчитал. так обстояли и обстоят дела на производстве - прибор однозначно характеризуется только связкой серийник + тип прибора. guest_20040621Но на Вашем месте я бы переделал структуру данных. было-бы интересно узнать, как именно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2006, 11:44 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
> так обстояли и обстоят дела на производстве - прибор однозначно > характеризуется только связкой серийник + тип прибора. Хм... какая-то религия мешает серийному номеру быть уникальным? Я не вижу ни одного разумного объяснения. > было-бы интересно узнать, как именно Уникальные серийные номера и независимые идентификаторы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2006, 12:05 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
> Хм... какая-то религия мешает серийному номеру быть уникальным? Я не вижу ни одного разумного объяснения. это вопрос отдельный. я не имею почти никакого влияния на его "физическое" решение в будующем, и совсем не имел в прошлом. исхожу из того, что есть. > Уникальные серийные номера и независимые идентификаторы. чем это по сути отличается от варианта 2? deviceid - можно считать еще и уникальным серийным номером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2006, 12:20 |
|
||
|
какие ключи выбрать для данной ситуации? не могу сделать выбор.
|
|||
|---|---|---|---|
|
#18+
проектант - бедолага> Хм... какая-то религия мешает серийному номеру быть уникальным? Я не вижу ни одного разумного объяснения. это вопрос отдельный. я не имею почти никакого влияния на его "физическое" решение в будующем, и совсем не имел в прошлом. исхожу из того, что есть. > Уникальные серийные номера и независимые идентификаторы. чем это по сути отличается от варианта 2? deviceid - можно считать еще и уникальным серийным номером. используйте вариант 2 + констрейнт на уникальность пары serial, device_typeid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2006, 13:59 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34037198&tid=1544973]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
171ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 522ms |

| 0 / 0 |
