powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Справочники, связанные с объектами
9 сообщений из 9, страница 1 из 1
Справочники, связанные с объектами
    #32161790
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Есть таблица организаций и таблица учета отношения к воинской обязанности сотрудников. В последней поле - Военкомат, где сотрудник на учете.
С одной стороны обычно для отчетов требуется только наименование Военкомата, но с другой могут потребоваться контакты или реквизиты, что уже сделано в таблице организаций.

Вопрос собственно в выборе варианта:
Вариант 1. Создать отдельную справочную таблицу Военкоматов.
Вариант 2. Вести Военкоматы в общей таблице организаций.

Минусы.
Вариант 1.
- Дублирование структур.
- Если по каким-то причинам Военкомат выступит как организация в иной ипостаси, дублирование данных со всеми его прелестями.

Вариант 2.
- При вводе данных пользователю придется выбирать Военкомат из справочника ВСЕХ организаций, что не есть хорошо.
- Выборку зарегистрированных в системе Военкоматов получить проблематично.

Решение с Вариантом 2 при добавлении в структуру таблицы организаций логического поля "Военкомат" не подходит, т.к. мало ли сколько подобных признаков. (Ex. Налоговые, Пенсионные фонды, Банки и т.п.).
Также не подходит поле признак из справочника, т.к. организация может относится к различным категориям одновременно.
...
Рейтинг: 0 / 0
Справочники, связанные с объектами
    #32161820
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если структура одинаковая, то хранить однозначно надо все в одной таблице организаций. Делаете спрачоник типов организаций, а раз уж одна организация может быть нескольких типов, то делаете промежуточную таблицу с 2 полями - Код Организации и Код типа организации и соотвествующе связываете со справочниками. Получается многие-ко-многим, все будет работать.
...
Рейтинг: 0 / 0
Справочники, связанные с объектами
    #32161825
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, похоже ничего другого не изобретешь.

А вот при предложенном варианте в продолжение вопроса.

Поле в таблице отношения к воинской обязанности привязывать к идентификатору таблицы организаций или к идентификатору записи промежуточной таблицы связей?
...
Рейтинг: 0 / 0
Справочники, связанные с объектами
    #32161886
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря не понял вопроса. Если вы о том - как узнать, что организация является воинской, то тут все элементарно - справочник типов организация можно сказать является статичным (я называю такие справочники системными) и пользователями изменяться не может. Вы спокойно можете вбить в него под жесткими кодами все существующие типы организаций и ссылатся на них в запросах. Но более удачным вариантом будет сделать вьювер, возвращающий Коды всех организаций, являющимися военными. Далее с таким вьювером будет легко манипулировать, что то типа того:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 -- Получить справочник военных организаций
 
select o.*
from Организации o
  inner join v_ВоенныеОрганизации v on v.КодОрганизации = o.КодОрганизации

 -- Проверить, что код организации принадлежит военной
 
if @КодОрганизации in (select КодОрганизации from v_ВоенныеОрганизации)
...


Таким же образом можно будет поделать вьювера на любые другие необходимые типы организаций и легко манипуляровать организациями.
...
Рейтинг: 0 / 0
Справочники, связанные с объектами
    #32161931
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поясняю вопрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Table Организации (id, Имя, ...);
Table Категории (id, Имя);
Table Организации-Категории (id, idОрганизация, idКатегория)

Table ВоинскаяОбязанность
  (...idВоенкомат reference Организация(id)...)
или
  (...idВоенкомат reference Организации-Категории(id)...)
...
Рейтинг: 0 / 0
Справочники, связанные с объектами
    #32161961
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таблице "Организации-Категории" поле id не нужно - idОрганизация + idКатегория и будут являться primary key. Естественно тогда останется в связях воинской обязанности только одна конструкция:
Table ВоинскаяОбязанность
(...idВоенкомат reference Организация(id)...)
...
Рейтинг: 0 / 0
Справочники, связанные с объектами
    #32161974
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но создав искуственный (точно в термине не уверен) первичный ключ для таблицы связей и привязавшись к нему, мы не допустим удаления ни используемой категории 'Военкомат', ни самой записи об отношении организации к военкоматам.
...
Рейтинг: 0 / 0
Справочники, связанные с объектами
    #32162065
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему это не удалим в таблице отношений ? Нормально удалим, так как 2 поля в этой таблице будут являться дочерними по отношению к таблицам организаций и типов организаций, а то, что они в связке образуют первичный ключ будет гарантировать нам уникальность информации и не позволит занести например дважды на одну организацию тип Военкомат. А удаления в родительских таблицах зависят только от логики и регулируются вами. Например связь Тип организации - Отношения будет правильно запрещать удаления записи в Типе организации, если на него ссылается хоть одна организация, чтобы не нарушить целостность данных организаций. А связь Организация-отношения фактически является подсвойством организации и при удалении организации все записи по этой организации в таблице отношений должны быть удалены. Это реализуется 3 путями и в основном зависит от возможностей SQL сервера - самый простой способ - указать каскадные удаления при создании связи между Организациями и Отношениями. Если каскадные операции не поддерживаются, то необходимо написать свой триггер на удаление записи в таблице Организаций, в котором нужно удалить все записи, имеющие код удаляемых организаций. Если тригерра тоже не поддерживаются, то перед удалением организации сначала придется вручную выполнять скрипт, аналогичный скрипту триггера, заключив скрипт удаления Отношений и Организаций в транзакцию, чтобы гарантировать целостность данных.

Вообще, чтобы не запутаться во всех этих связях, необходимо всегда четко разделять для себя связи, которых может быть 2 вида:
1. Свойства родительского обьекта - например каждая запись в Отношениях определяет свойство организации принадлежности к типу организаций
2. Ссылки на другой обьект - например каждая запись в Отношениях ссылается на определенный тип организации в таблице Тип организаций

Обычно свойства обьекта не должны ограничивать его удаление, т.е. если нам разрешено удалить организацию, то его свойства в таблицах Отношения тоже должны автоматически удалиться. Естественно бывают исключения - например когда свойства при определенных условиях уже не могут быть удалены, что может разруливаться опять же с помощью каскадных удалений и тригерров самой таблицы свойств (в нашем случае таблицы Отношений). Если удаление в подчиненной таблице по каким то причинам будет прервано, то удаление записи в таблице Организаций не состоится, и это будет правильно.

Ссылки же всегда должны хранится как связи без всяких каскадных удалений. Это будет гарантировать, что в справочниках можно будет удалять только ту информацию, на которую никто не ссылается.
...
Рейтинг: 0 / 0
Справочники, связанные с объектами
    #32162296
Фотография wara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В теме, Проблемное сохранение данных о клиенте по -моему, рассмотрены сходные вопросы.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Справочники, связанные с объектами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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