powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Множественные значения справочников
13 сообщений из 13, страница 1 из 1
Множественные значения справочников
    #37001817
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, которое в хранимой процедуре или функции разбиралось бы и по этим параметрам находились бы значения справочника.

вопрос - такой подход допустим? при условии, что задача системы - поиск, ввод и корректировка информации, количество записей в таблицах - сотни тысяч/несколько миллионов. если нет, то буду благодарен за альтернативной решение в организации части структуры БД по работе со справочниками
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37002163
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrakkСтруктура базы предполагает наличие большого количества справочников с возможностью использования множества значений справочника для одного поля. Связь поле таблицы <-> множество значений справочника организовывается через таблицу соотвествий. Но учитывая, что справочников много, я решил не делать таблицу соответствий значений для каждого справочника и таблицы, а сделать одну таблицу для всех справочников, имеющую вот такую структуруСмысл ? В используемой Вами СУБД есть ограничение на количество создаваемых таблиц и/или отсутствует поддержка ограничений типа FOREIGN KEY ?
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37002217
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Но у Вас нет такой СУБД, поэтому забудьте все, что я сказал:)
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37002568
mrakk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ChAmrakkСтруктура базы предполагает наличие большого количества справочников с возможностью использования множества значений справочника для одного поля. Связь поле таблицы <-> множество значений справочника организовывается через таблицу соотвествий. Но учитывая, что справочников много, я решил не делать таблицу соответствий значений для каждого справочника и таблицы, а сделать одну таблицу для всех справочников, имеющую вот такую структуруСмысл ? В используемой Вами СУБД есть ограничение на количество создаваемых таблиц и/или отсутствует поддержка ограничений типа FOREIGN KEY ?

смысл один - организовать как можно более простую систему взаимодействия клиента с БД

уточняю - СУБД MSSQL2005.
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37002600
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrakkсмысл один - организовать как можно более простую систему взаимодействия клиента с БД

уточняю - СУБД MSSQL2005.Ваш подход вряд ли позволит упростить систему взаимодействия клиента и БД. На чем пишете клиента? Что предполагает делать приложение?
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37002673
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrakkChAВ используемой Вами СУБД есть ограничение на количество создаваемых таблиц и/или отсутствует поддержка ограничений типа FOREIGN KEY ?организовать как можно более простую систему взаимодействия клиента с БДНаписать универсальную форму под запрос к конкретной таблице ничуть не сложнее, чем к одной таблице с фильтрацией по идентификатору справочника. При этом ссылочная целостность при этом будет контролироваться сервером, а не потенциальными ошибками в клиенте.
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37003097
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы, mrakk, вкладываете неверный смысл в понятие "справочник". В принципе, ничего крамольного в предложенной вами организации данных нет. Но я не могу представить себе "большое количество справочников", которые укладывались бы в структуру "идентификатор - значение". Список предопределенных значений - это не справочник.
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37003528
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну положим внешний ключ на это навернуть можно.
только структура будет немного другой
Код: 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.
create table dic_type
(
dic_type_id int primary key,
dic_type_desc varchar( 100 ) -- имя таблицы
)

create table main_dict
(
dict_id int primary key,
descr varchar( 100 ),
dict_type_id int references dic_type
)

create table my_table
(
id int
dict_id int references main_dict,
....
)

create view v_dict1 as
select dict_id,descr
from main_dict m
join dic_type t on m.dic_type_id=t.dic_type_id
where dic_type_desc='table 1'

create view v_dict2 as
select dict_id,descr
from main_dict m
join dic_type t on m.dic_type_id=t.dic_type_id
where dic_type_desc='table 2'


В лучшем случае вместо положим десятков таблиц вы имеете одну. Выглядит как экономия, но смысла особого не несет. Выгоды сомнительны, а вот проблем на ровном месте можно поиметь много - это и дополнительные поля для отдельных справочников, забытые в процессе проектирования, это и неочевидность раздачи прав на таблицы, это и возможные конфликты блокировок невозможные в случае всем сестрам по серьгам и т.д. и т.п.
mrakkбуду благодарен за альтернативной решение в организации части структуры БД по работе со справочникамиБанально: мухи отдельно, котлеты отдельно. Отдельные таблицы (сгенереные или с жестким соблюдением соглашений о наименованиях таблиц полей и т.д)
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37003533
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ну у вас множество значений то есть плюс одна таблица
Код: plaintext
1.
2.
3.
4.
create table my_table_dict_xref
id_table int references my_table,
dict_id int references main_dict
primary key id_table,dict_id
То есть коэффициент экономии возрастает вдвое.
Однако про овчинка выделки не стоит вывод остается.
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37004739
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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С-программистов, а конечные пользователи типа бухгалтеров по-прежнему путаются даже в интерфейсе. В общем, кесарю - кесарево...
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37005356
mrakk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо ) принято решение не делать одну большую таблицу, вмещающую все справочники. Делаю для каждой связи "справочник -> поле таблицы" отдельную таблицу соответствий.
эх, люблю людей с этого форума за то, что отговаривают от всякой ерунды )))
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37006049
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако, наверное, никто не будет отговаривать от того, если для презентационных целей вы сделаете одну универсальную форму с возможностью выбора справочника и вложенными гридами для редактирования его данных с динамическим формированием запроса к БД и динамическим же биндингом. Кроме самих справочников потребуется создать метаописание для них.
...
Рейтинг: 0 / 0
Множественные значения справочников
    #37006742
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrakkВсем спасибо ) принято решение не делать одну большую таблицу, вмещающую все справочники. Делаю для каждой связи "справочник -> поле таблицы" отдельную таблицу соответствий.
эх, люблю людей с этого форума за то, что отговаривают от всякой ерунды )))
Но при этом не отговаривают от главного - от выбора плохой СУБД:)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Множественные значения справочников
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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