|
Справочники, связанные с объектами
|
|||
---|---|---|---|
#18+
Привет. Есть таблица организаций и таблица учета отношения к воинской обязанности сотрудников. В последней поле - Военкомат, где сотрудник на учете. С одной стороны обычно для отчетов требуется только наименование Военкомата, но с другой могут потребоваться контакты или реквизиты, что уже сделано в таблице организаций. Вопрос собственно в выборе варианта: Вариант 1. Создать отдельную справочную таблицу Военкоматов. Вариант 2. Вести Военкоматы в общей таблице организаций. Минусы. Вариант 1. - Дублирование структур. - Если по каким-то причинам Военкомат выступит как организация в иной ипостаси, дублирование данных со всеми его прелестями. Вариант 2. - При вводе данных пользователю придется выбирать Военкомат из справочника ВСЕХ организаций, что не есть хорошо. - Выборку зарегистрированных в системе Военкоматов получить проблематично. Решение с Вариантом 2 при добавлении в структуру таблицы организаций логического поля "Военкомат" не подходит, т.к. мало ли сколько подобных признаков. (Ex. Налоговые, Пенсионные фонды, Банки и т.п.). Также не подходит поле признак из справочника, т.к. организация может относится к различным категориям одновременно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2003, 14:07 |
|
Справочники, связанные с объектами
|
|||
---|---|---|---|
#18+
Если структура одинаковая, то хранить однозначно надо все в одной таблице организаций. Делаете спрачоник типов организаций, а раз уж одна организация может быть нескольких типов, то делаете промежуточную таблицу с 2 полями - Код Организации и Код типа организации и соотвествующе связываете со справочниками. Получается многие-ко-многим, все будет работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2003, 14:30 |
|
Справочники, связанные с объектами
|
|||
---|---|---|---|
#18+
Да, похоже ничего другого не изобретешь. А вот при предложенном варианте в продолжение вопроса. Поле в таблице отношения к воинской обязанности привязывать к идентификатору таблицы организаций или к идентификатору записи промежуточной таблицы связей? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2003, 14:38 |
|
Справочники, связанные с объектами
|
|||
---|---|---|---|
#18+
Честно говоря не понял вопроса. Если вы о том - как узнать, что организация является воинской, то тут все элементарно - справочник типов организация можно сказать является статичным (я называю такие справочники системными) и пользователями изменяться не может. Вы спокойно можете вбить в него под жесткими кодами все существующие типы организаций и ссылатся на них в запросах. Но более удачным вариантом будет сделать вьювер, возвращающий Коды всех организаций, являющимися военными. Далее с таким вьювером будет легко манипулировать, что то типа того: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Таким же образом можно будет поделать вьювера на любые другие необходимые типы организаций и легко манипуляровать организациями. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2003, 15:22 |
|
Справочники, связанные с объектами
|
|||
---|---|---|---|
#18+
Поясняю вопрос Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2003, 15:46 |
|
Справочники, связанные с объектами
|
|||
---|---|---|---|
#18+
В таблице "Организации-Категории" поле id не нужно - idОрганизация + idКатегория и будут являться primary key. Естественно тогда останется в связях воинской обязанности только одна конструкция: Table ВоинскаяОбязанность (...idВоенкомат reference Организация(id)...) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2003, 16:01 |
|
Справочники, связанные с объектами
|
|||
---|---|---|---|
#18+
Но создав искуственный (точно в термине не уверен) первичный ключ для таблицы связей и привязавшись к нему, мы не допустим удаления ни используемой категории 'Военкомат', ни самой записи об отношении организации к военкоматам. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2003, 16:12 |
|
Справочники, связанные с объектами
|
|||
---|---|---|---|
#18+
Почему это не удалим в таблице отношений ? Нормально удалим, так как 2 поля в этой таблице будут являться дочерними по отношению к таблицам организаций и типов организаций, а то, что они в связке образуют первичный ключ будет гарантировать нам уникальность информации и не позволит занести например дважды на одну организацию тип Военкомат. А удаления в родительских таблицах зависят только от логики и регулируются вами. Например связь Тип организации - Отношения будет правильно запрещать удаления записи в Типе организации, если на него ссылается хоть одна организация, чтобы не нарушить целостность данных организаций. А связь Организация-отношения фактически является подсвойством организации и при удалении организации все записи по этой организации в таблице отношений должны быть удалены. Это реализуется 3 путями и в основном зависит от возможностей SQL сервера - самый простой способ - указать каскадные удаления при создании связи между Организациями и Отношениями. Если каскадные операции не поддерживаются, то необходимо написать свой триггер на удаление записи в таблице Организаций, в котором нужно удалить все записи, имеющие код удаляемых организаций. Если тригерра тоже не поддерживаются, то перед удалением организации сначала придется вручную выполнять скрипт, аналогичный скрипту триггера, заключив скрипт удаления Отношений и Организаций в транзакцию, чтобы гарантировать целостность данных. Вообще, чтобы не запутаться во всех этих связях, необходимо всегда четко разделять для себя связи, которых может быть 2 вида: 1. Свойства родительского обьекта - например каждая запись в Отношениях определяет свойство организации принадлежности к типу организаций 2. Ссылки на другой обьект - например каждая запись в Отношениях ссылается на определенный тип организации в таблице Тип организаций Обычно свойства обьекта не должны ограничивать его удаление, т.е. если нам разрешено удалить организацию, то его свойства в таблицах Отношения тоже должны автоматически удалиться. Естественно бывают исключения - например когда свойства при определенных условиях уже не могут быть удалены, что может разруливаться опять же с помощью каскадных удалений и тригерров самой таблицы свойств (в нашем случае таблицы Отношений). Если удаление в подчиненной таблице по каким то причинам будет прервано, то удаление записи в таблице Организаций не состоится, и это будет правильно. Ссылки же всегда должны хранится как связи без всяких каскадных удалений. Это будет гарантировать, что в справочниках можно будет удалять только ту информацию, на которую никто не ссылается. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2003, 17:05 |
|
|
start [/forum/topic.php?fid=32&fpage=181&tid=1546967]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
88ms |
get tp. blocked users: |
2ms |
others: | 248ms |
total: | 419ms |
0 / 0 |