|
|
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
Существует некая база, где каждому типу Объекта учета соответвует своя таблица. Некоторые из атрибутов этих об-в учета это так называемые (пользуюсь сложившейся у нас терминологии) - "Множественные поля типа справочник". Например - тип объекта учета - "Физич Лицо" - в нем есть поле "Гражданство". У физлица может быть несклько гражданств, Иванов Иван Иваныч может быть гражданином США и Израиля. "Гражданство" оформлено в виде отдельного справочника в отдельной таблице. Для хранения полей типа "Множественное поле типа справочник" для всех типов объектов учета используется отдельная таблица MultiValues с полями ID(просто аутоинкременный айдишник), IDDict (айдишник элемента справочника), IDObjType (айдишник типа обекта учета который связан с таблице в котором хранятся остальные данные этого типа объекта учета), IDObj - (айдишник самого объекта учета из таблицы) , IDField(айдишник атрибута этого типа Объекта учета ). Но, здесь возникли два неприятных момента.. а)У нас для аудита изменений на каждую таблицу для типа объекта учета повешен триггер, который скидывает все изменения в некие отдельные таблицы которые хранят историю. Причем каждому изменения объекта учета соответсвует запись информации о событии - со своим айдишником. Чтобы учитывать изменения в полях типа "Множественное поле типа справочник", - пришлось на таблицу MultiValues тоже навешивать триггер. Но, получается что так как срабатывают два независимых триггера, то происходит запись двух и более событий, хотя это одно событие реально. б) доступ к объектам учета реализован через набор вьюх, с разграничением по пермишшионам. Отдельная таблица в эту схему вписывается, мягко говоря, криво. //// ну и собственно вопрос - чо делать? Пока на ум приходит только отказаться от отдельной таблицы MultiValues и писать эти множественные значения как некий строчный список через допустим запятую в основные таблицы объектов учета . Чем чревато такое изменение архитектуры, кроме того что здесь сложнее будет организовать поддержание ссылочной целостности через через Foreing Constrains - придется с триггерами мудрить..? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2007, 14:52 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
Но, получается что так как срабатывают два независимых триггера, то происходит запись двух и более событий, хотя это одно событие реально. Во многом зависит от СУБД... в MSSQL, например, на Код: plaintext Соответственно, применительно к MSSQL список можно передать как массив (например как текстовый параметр с xml) в хранимую процедуру, там получить из этого xml выборку (select f from OPENXML...), которую одним insert-ом и вставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2007, 18:53 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
А почему считается что два события это неверно. Предположим кто-то внес изменение в таблицу MultiValues (причем минуя "штатую" процедуру). Это отразится в истории. Изменение же таблицы объекта учета в данном случае не попадет в историю так как его не было, а может быть и наоборот. Почему факт изменения двух таблиц не должен отражаться? Если проблема, в том что кто-то не хочет этого видеть где-то в режиме просмотра истории изменения записей, то может стоит доработать именно этот режим, чтобы там не показывались такие двойные изменения, хотя триггер их записал. В любом случае, я бы из-за такой мелочи не ломал структуру если она устраивала до сих пор, тем более в направлении "некий строчный список через допустим запятую" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2007, 20:39 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
SergGolА почему считается что два события это неверно. Потому что изменение любого 1-го элемента списка должно приводить к созданию истории, в которой сохраняется весь список. Иначе невозможно получить состояние списка на определенный момент. Лично я вообще не сторонник постороения истории на триггерах, как, впрочем, и самих триггеров, разве что в очень простых случаях плоских таблиц. Ведь помимо самих изменений, до которых можно достучаться в триггерах необходимо знать еще многое из контекста приложения(например, идентификатор безопасности) и подсунуть это в контекст СУБД, чтобы это было видно в триггерах, бывает порой не просто. Лучше пусть создание необходимой истории контролируется бизнес-объектами, которые содержат для этого специализированные коллекции. Т.е. сама запись истории - это тоже бизнес-объект, имеющий свой DAL и CRUD. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2007, 22:39 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
Роман Дынник Но, получается что так как срабатывают два независимых триггера, то происходит запись двух и более событий, хотя это одно событие реально. Во многом зависит от СУБД... в MSSQL, например, на Код: plaintext Соответственно, применительно к MSSQL список можно передать как массив (например как текстовый параметр с xml) в хранимую процедуру, там получить из этого xml выборку (select f from OPENXML...), которую одним insert-ом и вставить. Да, используется MSSQL 2005. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 10:11 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
Роман Дынник Но, получается что так как срабатывают два независимых триггера, то происходит запись двух и более событий, хотя это одно событие реально. Во многом зависит от СУБД... в MSSQL, например, на Код: plaintext Соответственно, применительно к MSSQL список можно передать как массив (например как текстовый параметр с xml) в хранимую процедуру, там получить из этого xml выборку (select f from OPENXML...), которую одним insert-ом и вставить. Да, используется MSSQL 2005. Прошу прощения - нажал на ctrl-enter случайно, недописав сообщение Я не совсем понял вариант который вы предлагаете - список передать как массив откуда и куда? Или вы имеете в виду что писать эти множественные значения и туда и туда - чтобы не переделывать механизм доступа к этим множественным значениям,причем писать не в таблицу MultiValues не отдельной процедурой а тригером из основной таблицы ОУ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 10:18 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
что то я не с той ноги сегодня встал... :-) в предыдущем посте фразу ",причем писать не в таблицу MultiValues не отдельной процедурой а тригером из основной таблицы " следует читать без "не" - ",причем писать в таблицу MultiValues не отдельной процедурой а тригером из основной таблицы" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 10:21 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
а все таки, если хранить такие вещи как строковый перечень числовых айдишников через запятую, чем это чревато? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 10:46 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
McCarсписок передать как массив откуда и куда с клиентского приложения в stored procedure. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 10:48 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
McCarа все таки, если хранить такие вещи как строковый перечень числовых айдишников через запятую, чем это чревато?Геморроем при малейшей обработке. Для один-ко-многим есть две таблицы со связью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 10:48 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
McCarа все таки, если хранить такие вещи как строковый перечень числовых айдишников через запятую, чем это чревато? потерей "родной" ссылочной целостности и существенным снижением производительности (для более менее комфортной работы понадобится функция, которая парсит список с разделителями и возвращает табличную переменную). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 10:51 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
а не спасёт Вас NestedLevel в триггере на Multivalue? Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 11:57 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
Роман Дынник McCarсписок передать как массив откуда и куда с клиентского приложения в stored procedure. проблема в том что мы тогда должны по хорошему передать в эту ХП айдишник события из таблицы Log_Fact куда собственно пишет триггер на таблицы ОУ ( таблица Log_Fact имеет структуру- ID, DateOfEvent, Login, ID_OT(айдишник типа объекта учета), ID_O(айдишник обхекта); сами изменненные значения пишутся из deleted в таблицу Log_depot которая связана с Log_Fact по этом айдишнику). А этот айдишник мы знаем только внутри триггера на основную таблицу. Можно конечно вынести вообще всю запись истории на уровень бизнес логики приложения, но заказчик хочет чтобы даже при прямом доступе на сервер любые изменения были бы запротоколированы(случай когда хитрый юзер зашел под админом и отключил триггера не рассматриваем как и захват сервера вооруженной группой :-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 14:40 |
|
||
|
как лучше организовать архитектуру базы при связях "Один- к многим"?
|
|||
|---|---|---|---|
|
#18+
вообщем пока я вижу только такое решение - таблицу MultiValue закрываем для прямой записи, в таблицы объектов учета пишем список через запятую - который и записывается в историю по стандартной схеме, при этом триггер разбирает этот список и закидывает в таблицу MultiValues. Кривовато и наверняка чем то чревато.. ну а как иначе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2007, 14:46 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34609842&tid=1544437]: |
0ms |
get settings: |
12ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
203ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 577ms |

| 0 / 0 |
