|
|
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
Структура базы предполагает наличие большого количества справочников с возможностью использования множества значений справочника для одного поля. Связь поле таблицы <-> множество значений справочника организовывается через таблицу соотвествий. Но учитывая, что справочников много, я решил не делать таблицу соответствий значений для каждого справочника и таблицы, а сделать одну таблицу для всех справочников, имеющую вот такую структуру : id_parent_table (int) - уникальный идентификатор строки в таблице, к полю которой относятся значения справочника parent_col_name (nvarchar) - название поля таблицы, к которому относятся значения справочника id_dictonary (int) - ссылается на значение справочника dictonary_name (nvarchar) - название справочника (имя таблицы справочника) справочники имеют одинаковую структуру : id (int) value (nvarchar) так же хотелось бы чтобы поле, к которому привязаны справочники имело какое-то значение по которому можно выцепить список значений справочника. думается сделать значение типа id_parent_table + _ + parent_col_name, которое в хранимой процедуре или функции разбиралось бы и по этим параметрам находились бы значения справочника. вопрос - такой подход допустим? при условии, что задача системы - поиск, ввод и корректировка информации, количество записей в таблицах - сотни тысяч/несколько миллионов. если нет, то буду благодарен за альтернативной решение в организации части структуры БД по работе со справочниками ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2010, 13:17 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
mrakkСтруктура базы предполагает наличие большого количества справочников с возможностью использования множества значений справочника для одного поля. Связь поле таблицы <-> множество значений справочника организовывается через таблицу соотвествий. Но учитывая, что справочников много, я решил не делать таблицу соответствий значений для каждого справочника и таблицы, а сделать одну таблицу для всех справочников, имеющую вот такую структуруСмысл ? В используемой Вами СУБД есть ограничение на количество создаваемых таблиц и/или отсутствует поддержка ограничений типа FOREIGN KEY ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2010, 14:51 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
mrakkСтруктура базы предполагает наличие большого количества справочников с возможностью использования множества значений справочника для одного поля. Связь поле таблицы <-> множество значений справочника организовывается через таблицу соотвествий. Но учитывая, что справочников много, я решил не делать таблицу соответствий значений для каждого справочника и таблицы, а сделать одну таблицу для всех справочников, имеющую вот такую структуру : id_parent_table (int) - уникальный идентификатор строки в таблице, к полю которой относятся значения справочника parent_col_name (nvarchar) - название поля таблицы, к которому относятся значения справочника id_dictonary (int) - ссылается на значение справочника dictonary_name (nvarchar) - название справочника (имя таблицы справочника) справочники имеют одинаковую структуру : id (int) value (nvarchar) так же хотелось бы чтобы поле, к которому привязаны справочники имело какое-то значение по которому можно выцепить список значений справочника. думается сделать значение типа id_parent_table + _ + parent_col_name, которое в хранимой процедуре или функции разбиралось бы и по этим параметрам находились бы значения справочника. вопрос - такой подход допустим? при условии, что задача системы - поиск, ввод и корректировка информации, количество записей в таблицах - сотни тысяч/несколько миллионов. если нет, то буду благодарен за альтернативной решение в организации части структуры БД по работе со справочниками Это все делается намного проще в хороших СУБД. С помощью типа характеристики объекта "набор кодов", то есть, с одной стороны это "набор" ("множественное поле", выражаясь Вашим языком), а с другой - в этом поле хранится набор кодов (а не наименований), так как у типа характеристики объекта (или, Вашими словами, у типа атрибута отношения) "код" есть два атрибута: код и наименование. Кстати это уже обсуждалось только что в соседней теме. PS Но у Вас нет такой СУБД, поэтому забудьте все, что я сказал:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2010, 15:01 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
ChAmrakkСтруктура базы предполагает наличие большого количества справочников с возможностью использования множества значений справочника для одного поля. Связь поле таблицы <-> множество значений справочника организовывается через таблицу соотвествий. Но учитывая, что справочников много, я решил не делать таблицу соответствий значений для каждого справочника и таблицы, а сделать одну таблицу для всех справочников, имеющую вот такую структуруСмысл ? В используемой Вами СУБД есть ограничение на количество создаваемых таблиц и/или отсутствует поддержка ограничений типа FOREIGN KEY ? смысл один - организовать как можно более простую систему взаимодействия клиента с БД уточняю - СУБД MSSQL2005. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2010, 16:24 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
mrakkсмысл один - организовать как можно более простую систему взаимодействия клиента с БД уточняю - СУБД MSSQL2005.Ваш подход вряд ли позволит упростить систему взаимодействия клиента и БД. На чем пишете клиента? Что предполагает делать приложение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2010, 16:36 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
mrakkChAВ используемой Вами СУБД есть ограничение на количество создаваемых таблиц и/или отсутствует поддержка ограничений типа FOREIGN KEY ?организовать как можно более простую систему взаимодействия клиента с БДНаписать универсальную форму под запрос к конкретной таблице ничуть не сложнее, чем к одной таблице с фильтрацией по идентификатору справочника. При этом ссылочная целостность при этом будет контролироваться сервером, а не потенциальными ошибками в клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2010, 16:54 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
Вы, mrakk, вкладываете неверный смысл в понятие "справочник". В принципе, ничего крамольного в предложенной вами организации данных нет. Но я не могу представить себе "большое количество справочников", которые укладывались бы в структуру "идентификатор - значение". Список предопределенных значений - это не справочник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2010, 19:38 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
Ну положим внешний ключ на это навернуть можно. только структура будет немного другой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. В лучшем случае вместо положим десятков таблиц вы имеете одну. Выглядит как экономия, но смысла особого не несет. Выгоды сомнительны, а вот проблем на ровном месте можно поиметь много - это и дополнительные поля для отдельных справочников, забытые в процессе проектирования, это и неочевидность раздачи прав на таблицы, это и возможные конфликты блокировок невозможные в случае всем сестрам по серьгам и т.д. и т.п. mrakkбуду благодарен за альтернативной решение в организации части структуры БД по работе со справочникамиБанально: мухи отдельно, котлеты отдельно. Отдельные таблицы (сгенереные или с жестким соблюдением соглашений о наименованиях таблиц полей и т.д) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 06:13 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
А ну у вас множество значений то есть плюс одна таблица Код: plaintext 1. 2. 3. 4. Однако про овчинка выделки не стоит вывод остается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 06:39 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
SERG1257Ну положим внешний ключ на это навернуть можно. только структура будет немного другойЕсли в поле одной таблицы допустимы значения только одного справочника, то "правильный" FOREIGN KEY невозможен, так как в это поле можно будет подставить любое значение из любого "справочника". Т.е., Ваш вариант формально позволяет в поле dict_id из my_table поставить любой dict_id из main_dict относящегося к любому dict_type_id и сервер это пропустит. Поэтому корректность придется проверять дополнительным кодом, неважно триггером или процедурой. Мало того, Ваш вариант предполагает множество view, которые с точки зрения клиента, ничем не отличаются от таблиц. Т.е., в БД вместо N справочных объектов(tables) появится N(views)+3(tables), да ещё и с необходимостью дополнительных проверок. Какая-то неправильная экономия получается. Как вариант, можно добавить в таблицу my_table еще и поле dict_type_id с ограничением типа CHECK (dict_type_id = 1) , т.е., допустимы только значения из справочника с идентификатором равным 1. После чего сделать FOREIGN KEY от неё составным типа (dict_type_id, dict_id) . Такой вариант уже лучше, так как использует штатные механизмы СУБД, но, как минимум, несколько усложняет модификацию пользовательской таблицы my_table , да и некоторая избыточность будет наблюдаться. В случае же отдельных таблиц, ссылочная целостность гарантирована сервером без всяких дополнительных усилий, самым естественным для РСУБД способом. Таким образом, вариант с одной большой таблицей не несёт никакой практической пользы, разве только за редкими исключениями. В частности, когда есть крайняя необходимость дать пользователю возможность создавать некие новые сущности, типа новых классификаторов, и связыванию их с какими-то конкретными полями каких-то других сущностей. Более того, это подразумевает возможность и удалять "их" сущности. Т.е., фактически пользователи будут заниматься самостоятельным "перепроектированием" БД без участия специалистов. Если они такие умные, то с таким же успехом им можно выдать профессиональные инстументы и пустить в БД, пущай "проектируют", но, избави Бог, заниматься поддержкой такой БД. Есть ещё несколько вариантов, когда такой подход может быть полезен, но они лежат далеко за пределами исходной постановки вопроса. P.S. Лично у меня, целесообразность "справочник справочников" в большинстве случаев вызывает сильные сомнения, так как практика показывает, что "вменяемых" пользователей исчезающе мало. Не в смысле умаления их умственных способностей, в своём деле это могут быть асы, а ровно на незнакомом им поле, где их "здравый смысл" может завести в тупик. Насколько мне известно, большинство инструментов, которые создавались для "обычных" пользователей, в конечном счёте всё равно используются программистами, как те же SQL и Basic. 1С тоже продвигался как конструктор, где любой пользователь бла-бла-бла, но свелось всё к тому, что появилась целая ниша для 1С-программистов, а конечные пользователи типа бухгалтеров по-прежнему путаются даже в интерфейсе. В общем, кесарю - кесарево... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 15:31 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
Всем спасибо ) принято решение не делать одну большую таблицу, вмещающую все справочники. Делаю для каждой связи "справочник -> поле таблицы" отдельную таблицу соответствий. эх, люблю людей с этого форума за то, что отговаривают от всякой ерунды ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2010, 18:54 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
Однако, наверное, никто не будет отговаривать от того, если для презентационных целей вы сделаете одну универсальную форму с возможностью выбора справочника и вложенными гридами для редактирования его данных с динамическим формированием запроса к БД и динамическим же биндингом. Кроме самих справочников потребуется создать метаописание для них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2010, 09:15 |
|
||
|
Множественные значения справочников
|
|||
|---|---|---|---|
|
#18+
mrakkВсем спасибо ) принято решение не делать одну большую таблицу, вмещающую все справочники. Делаю для каждой связи "справочник -> поле таблицы" отдельную таблицу соответствий. эх, люблю людей с этого форума за то, что отговаривают от всякой ерунды ))) Но при этом не отговаривают от главного - от выбора плохой СУБД:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2010, 12:24 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37003533&tid=1542411]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 442ms |

| 0 / 0 |
