|
|
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
Пожалуйста, помогите советом. Проблема: ведется учет прав собственности. Структура таблицы: Идентификатор объекта, Идентификатор собственника, дата начала права собственности, дата прекращения права собственности. Первые три реквизита заполняются пользователем при вводе очередного документа. Последний рассчитывается автоматически - находится предыдущий документ по тому же объекту и в него заносится соответствующая дата прекращения права собственности. Пользователь может в любой момент захотеть отредактировать (изменить объект, собственника или дату) или удалить любой старый документ. Как в многопользовательской системе обеспечить целостность данных (в части касающейся соответствия даты начала и даты прекращения)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 15:06 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
Для обсуждения, хотелось бы прочитать возражения: OWNS ------ OBJ_ID -- ID объекта INI_DATE -- Дата начала периода PRE_DATE NULL -- Дата начала предшествующего периода primary key (OBJ_ID, INI_DATE) unique (OBJ_ID, PRE_DATE) foreign key (OWN_ID, PRE_DATE) references OWNS (OBJ_ID, INI_DATE) Т.е. при смене владельца добавляется новая запись, ссылающаяся на предыдущую и таким образом выстраивается линейная цепочка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 15:24 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
>> PRE_DATE NULL -- Дата начала предшествующего периода Вы хотите сказать есть такие временные отрезки, когда собственностью никто не владеет? т.е. она находится в подвешенном состоянии?... типа.. в собственности государства?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 15:56 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
имеются ли ситуации когда собственностью владеют сразу несколько субъектов? Например в равных долях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 15:57 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ. Я не совсем понял, какую структуру данных Вы предлагаете - отсутствует индентификатор собственника. Но это, похоже, просто опечатка. Кроме того, Вы, кажется предлагаете ссылку на предыдущую запись о регистрации собственности. Я не против, но , если есть вторая дата - дата прекращения, то такая ссылка избыточна. Мои проблемы: мне кажется, что необходимо иметь в одной записи и дату начала и дату окончания - по причине быстродействия, приходится очень часто и очень быстро отвечать на вопрос: какие объекты находились в собственности конкретного собственника на конкретный момент времени в прошлом. Это должно летать с реактивной скоростью. Поэтому обе даты должны присутствовать в одной записи. Вторая моя проблема: когда возникает необходимость отредактировать не последний, а старый документ, и исправить объект, собственника, дату, то может возникнуть необходимость одновременно исправить несколько других документов - предыдущий к первоначальному состоянию документа и предыдущий к окончательному состоянию (может измениться объект). Если предыдущий к первоначальному еще можно заблокировать от редактирования другими пользователями в многопользовательской системе, то предыдущий к окончательному состоянию - неизвестно какой. И другой пользователь в этот момент может его тоже пытаться редактировать. Тут целостность может серьезно пострадать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 15:59 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
Собственность только одного собственника. Объектом является доля. Объектом всегда кто-то владеет. Даты окончания права собственности может не быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 16:01 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
Я прошу дать совет относительно тех алгоритмов, которые необходимо запустить в момент сохранения измененного старого документа и в момент сохранения нового документа. В самом плохом случае, возникает необходимость откорректировать максимум три документа. 1. Документ А - редактирует пользователь А. Он хочет заменить объект собственности с О1 на О2. 2. Документ Б - предыдущее право собственности объекта О1. Этот документ по невезению вдруг захотел поредактировать пользователь Б. 3. ДОкумент В - предыдущее право собственности объекта О2. Его тоже по невезению захотел вдруг поредактировать пользователь В. Сначала нажал на кнопку "Редактировать" пользователь А, потом Пользователь "В". Потом пользователь А занес мыша над кнопкой "Сохранить". И нажал. Позволить это ему сделать??? Потом пользователь "В" занес мыша над кнопкой "Сохранить". Что делать? В промежутке между этими событиями пользователь Б тоже шуршит мышом. Но ему можно заглушить кислород. А стоит ли??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 16:12 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
Жаль что у вас MSSQL. В других базах подобные ситуации элементарно решаются триггерами BEFORE + AFTER. На вскидку: Дата начала срока должна всегда быть меньше даты окончания срока. (check constraint) Ключи (Код объекта,Дата начала ) и (Код объекта,дата окончания) должны быть уникальными. Цепочку я бы делать не стал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 16:19 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
2 gardenman Нет, пустое значение может быть лишь один раз при вводе первой записи о владении (вот чего я забыл, так это check, проверяющий возрастание дат) 2 medium Ссылка на владельца конечно должна быть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 16:33 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
2 gardemann А помогут ли триггеры? Если мы имеем дело с версионным сервером, неподтвержденные изменения не видны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 16:35 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
Ну, с версионниками я особо не работал. А на блокировочниках (DB2) прокатывает за милую душу. > Нет, пустое значение может быть лишь один раз при вводе первой записи о владении Хм... А почему бы не от этого не избавиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 17:00 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
Еще раз прошу - обратите внимание на проблему - какие алгоритмы отработать в момент попытки сохранения документа. Один пользователь в принципе видит, какие пользователи редактируют другие документы с какими идентификаторами, но в какую сторону делают изменения - не знает. Кому разрешить сохранение, кому - от винта. Необходимо обеспечить шустрый счет по датам. Поэтому две даты в записи. Все остальное - произвольно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 17:11 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
В принципе, я кажется разобрался. В момент сохранения документа А надо проверить, начал ли кто-нибудь редактирование предыдущих документов по отношению к первоначальному значению "объект+дата"(Б) и к окончательному значению "объект+дата"(В). Если хотя бы один из этих документов "взят на редактирование" - отказать в возможности сохранения и сообщить сведения о пользователе, осуществляющем редактирование. Если ни один из этих документов не взят на редактирование, то в одной транзакции обновить значения "дата окончания права собственности" в обоих документах Б и В, а заодно и А. Всем большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 17:35 |
|
||
|
Как обеспечить целостность данных
|
|||
|---|---|---|---|
|
#18+
2 gardenman Хм... А почему бы не от этого не избавиться? Что имелось ввиду? -То, что я предложил гарантирует отсуствие пересечений интервалов дат. -Если нужно править старые записи - это определенная возня (не все серверы умеют делать каскадное обновление). -Выборка данных предполагает left join по уникальному ключу, по идее это быстро ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2006, 17:39 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33477162&tid=1545471]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
50ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 345ms |

| 0 / 0 |
