• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Связывание двух документов

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Довольно часто бывает необходимо "связать" документы двух типов. Назовем их A и B. Нужно, чтобы из документа типа A можно было увидеть список документов типа B через встроенное представление. А из документов типа B увидеть список документов типа A. Чтобы было более понятно, я это изобразил на рисунке.
Предполагается, что для связи будут использованы UNID (хотя, это не столь важно).
Вроде бы, сделать достаточно просто. В документе типа A создаем поле, которое содержит список UNID документов типа B. И наоборот. И чтобы связать два документа, нужно в соответствующие поля добавить их UNID.
Но тут возникают некоторые неудобства. А именно вероятность появления конфликта записи или репликации при добавлении ссылок. :) Частично этого можно избежать использованием функции блокировки документов, что тоже не совсем удобно.
Поэтому я хочу узнать, как вы решали эту проблему.
У меня есть метод и я опишу его чуть позже. :)
 

Вложения

  • 11.jpg
    11.jpg
    5,6 КБ · Просмотры: 461
F

Fossil Code

...
Вроде бы, сделать достаточно просто. В документе типа A создаем поле, которое содержит список UNID документов типа B. И наоборот. И чтобы связать два документа, нужно в соответствующие поля добавить их UNID. Но тут возникают некоторые неудобства. А именно вероятность появления конфликта записи или репликации при добавлении ссылок.
...

1) А эти поля не должны быть статическими. Их достаточно вычислять при открытии документа.

2) Еще можно сделать вид с двумя категориями Тип "А" и Тип "Б" и ограничивать встроенный вид в отображении одной из них.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Fossil Code+9:02:2007, 12:53 -->
<span class="vbquote">(Fossil Code @ 9:02:2007, 12:53 )</span><!--QuoteEBegin-->1) А эти поля не должны быть статическими. Их достаточно вычислять при открытии документа.
[snapback]55576" rel="nofollow" target="_blank[/snapback]​
[/quote]
Каким образом? Если через @DbLookUp, то все равно в других документах(которые мы должны показать в встроенном представлении) должна быть какая-то информация (UNID в нашем случае), связанная с открываемым документом. По-моему, от этого ничего не изменится.

<!--QuoteBegin-Fossil Code+9:02:2007, 12:53 -->
<span class="vbquote">(Fossil Code @ 9:02:2007, 12:53 )</span><!--QuoteEBegin-->2) Еще можно сделать вид с двумя категориями Тип "А" и Тип "Б" и ограничивать встроенный вид в отображении одной из них.
[snapback]55576" rel="nofollow" target="_blank[/snapback]​
[/quote]
Можно. Только задача не в том как показать, а как связать документы.
 
F

Fossil Code

Извините, извините! Цитирую: Довольно часто бывает необходимо "связать" два типа документа. Назовем их A и B. Нужно, чтобы из документа типа A можно было увидеть список документов типа B через встроенное представление. А из документов типа B увидеть список документов типа A.

Т.е. "связываются" _типы_ документов, а цель "связывания" -- показ через встроенное представление. Вы ведь так писали? И говорили, что Юнид -- так, для примера. Другой хороший пример для _типа_ документа -- название его формы. Согласны, что такая трактовка допускается постановкой задачи, и при этом ее предельно упрощает?

1) Если делать поле динамическим, т.е. вычислять его при открытии документа, пользуясь для отбора нужным типом, а тогда информация о всех документах будет браться из актуальной БД, а задачи обновления полей по всем документам не будет. Тем самым уменьшится риск конфликта репликации и устранится риск конфликта сохранения, по крайней мере за счет устранения массовых операций перезаписи, связанных с этой процедурой.

2) Это решает поставленную задачу показа и устранения конфликтов (см.1). Иначе нужно определить, что бы означало "связывание" и его цель.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Fossil Code+9:02:2007, 13:57 -->
<span class="vbquote">(Fossil Code @ 9:02:2007, 13:57 )</span><!--QuoteEBegin-->Согласны, что такая трактовка допускается постановкой задачи, и при этом ее предельно упрощает?
[snapback]55597" rel="nofollow" target="_blank[/snapback]​
[/quote]
Согласен. Извиняюсь. Под вечер правописание волнует меня меньше всего. :rolleyes:
Правильно будет: связать документы двух типов. Сейчас поправлю.
 
K

K-Fire

А почему обязательно надо в форме А иметь эмбеддед вью документов Б? Может просто поля типа список будет достаточно?
У нас сделано так: хотспот который при клике на этот список открывает маленький диалог с выбором названий этих документов, и потом открывает выбранный документ. А в форме Б ембеддед вью.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Для: K-Fire
Можно. Но это менее удобно и требует дополнительных телодвижений. К тому же лично мне не нравится, когда в одном месте используется встроенное представление, а в другом выбор из списка. Результат один и то же, а способы его получение разные.
 
K

K-Fire

Ну тогда напишите агент, который ночью будет отрабатывать документы А, в которых проставлены ссылки на документы Б, и проставлять кросс-ссылки в док-ты Б. Конфликтов сохранения не будет.

Можно еще придумать более извратно: ввести промежуточную сущность, и показывать ее в ембеддед вьюхах. А в самой вью на queryopendocument подсовывать уже либо док-ты А, либо Б :rolleyes:
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-K-Fire+9:02:2007, 15:14 -->
<span class="vbquote">(K-Fire @ 9:02:2007, 15:14 )</span><!--QuoteEBegin-->Ну тогда напишите агент, который ночью будет отрабатывать документы А, в которых проставлены ссылки на документы Б, и проставлять кросс-ссылки в док-ты Б. Конфликтов сохранения не будет.
[snapback]55623" rel="nofollow" target="_blank[/snapback]​
[/quote]
Имхо, это как раз извращение. Ждать целый день. :rolleyes:

<!--QuoteBegin-K-Fire+9:02:2007, 15:14 -->
<span class="vbquote">(K-Fire @ 9:02:2007, 15:14 )</span><!--QuoteEBegin-->Можно еще придумать более извратно: ввести промежуточную сущность, и показывать ее в ембеддед вьюхах. А в самой вью на queryopendocument подсовывать уже либо док-ты А, либо Б
[snapback]55623" rel="nofollow" target="_blank[/snapback]​
[/quote]
А вот так сделал я. Через дополнительный документ. Правда без извращений с queryopendocument и остальным. Во встроенном представлении показываются нормальные документы. Т.е. для пользователей совершенно ничего не изменилось. Минус в том, что при связывании трех документов(A, B и C) между собой я уже начал путаться. И метод сам по себе немного перегруженный. :)
 
K

K-Fire

<!--QuoteBegin-Medevic+9:02:2007, 14:25 -->
<span class="vbquote">(Medevic @ 9:02:2007, 14:25 )</span><!--QuoteEBegin-->А вот так сделал я. Через дополнительный документ. Правда без извращений с queryopendocument и остальным. Во встроенном представлении показываются нормальные документы.
[snapback]55628" rel="nofollow" target="_blank[/snapback]​
[/quote]

А вот тут можно поподробнее? Во встроенном представлении в форме А показываются документы Б. Для этого в документе Б должен быть айтем, по значению которого делаем отбор, правильно?
Значит вы каким-то способом прописываете это значение в Б ? Как это вы делаете используя документ С ?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-K-Fire+9:02:2007, 15:52 -->
<span class="vbquote">(K-Fire @ 9:02:2007, 15:52 )</span><!--QuoteEBegin-->А вот тут можно поподробнее? Во встроенном представлении в форме А показываются документы Б. Для этого в документе Б должен быть айтем, по значению которого делаем отбор, правильно?
Значит вы каким-то способом прописываете это значение в Б ? Как это вы делаете используя документ С ?

[snapback]55637" rel="nofollow" target="_blank[/snapback]​
[/quote]
Документ C - это третий тип документа. Это у меня в реальности три типа документов. Для связывания используется другой. Да и связь можно сделать только типа один ко многих. Поэтому и спрашиваю, какие есть способы.
Для двух типов документа конструкция простая.
Пусть, нужно создать документ типа A (назовем его A) и два связанных с ним документа типа B (назовем их B1 и B2).
При первом сохранении A создается дополнительный(связующий) документ, которое содержит два поля. Одно - UNID A, второе потом будет содержать UNID'ы B1 и B2. В A записываем UNID это дополнительного документа.
Потом создаем документ B1 (у меня для этого есть кнопка в документе A). В момент создания B1 мы прописываем в определенное поле UNID связующего документа (который создали при сохранении A). И добавляем UNID B1 в соответствующе поле связующего документа.
Также делаем со вторым документом B2.
В результате имеем документ A, и два документа B1 и B2, которые содержат UNID общего связующего документа.
Теперь легко их отобрать во встроенном представлении друг у друга по этому UNID.
 
F

Fossil Code

Ну просто удивительно, как разные товарищи, например, Medevic и Fossil Code, могут обсуждать что-то одно, говоря не вполне об одном предмете, или об одном предмете, но о разных его сторонах! :D

Только теперь мне стало понятно, что же именно Вы имели в виду под связыванием документов разных типов. Знаете, я отвечаю на такой вопрос просто: чтобы была связь между эн документами произвольных типов, все они должны иметь поле (или поля), в которых присутствуют значения одной семантики. Их значения (возможно, в разных их комбинациях) и служат "вертелом" на который можно "насадить" то или иное подмножество группп связанных документов.

Как упомянутые значения в документы заносить -- вопрос тесно связанный с желаемым интерфейсом пользователя и логикой работы базы и процедурными связями между документами. Вот Вы показали, каким приемом для данной цели пользуетесь. Понятно. Своей методой, я, кажется, тоже сумел поделиться.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!