Начну с рассмотрения развития идеи. Начиная свой “проект” я был просто-таки уверен, что это движок займет у меня месяц-два. А как бы не так! Просто все начиналось довольно банально – нужна была иерархия тегов. Но “реализовав” ее (до конечной реализации дело не дошло: создал обработку, которая могла выводить это самое дерево), мне она показалась недостаточной. Так как я решил что у меня будет “полноценный” органайзер. Под полноценным я понимаю, что тегом может являться все что угодно – любой объект базы, причем объект в расширенном смысле.
Вскоре стало ясно, что нужны свойства объектов. Точнее, свойства тегов. Около месяца ушло на осознание этих свойств. После чего пришлось нехотя признать что нужны деревья значений. Около двух недель ушло на написание основных процедур и функций по работе с деревьями. Как-то само собой стало понятно что свойства могут быть сложные. И что свойства так же связаны между собой. Например, “Главный бухгалтер” входит в более общую группу “Бухгалтер”. Проблемы возникли с определение работы и хранением свойств типа “Контактные данные – Физический адрес”. Но эти вопросы остались чисто теоретическими, хотя были более-менее реализованы.
Через несколько месяцев у меня было нечто близкое, как мне казалось, к финальной версии. У меня были за плечами процедуры перестановок элементов дерева не теряя родителей, процедуры нахождения объектов, процедуры нахождения вхождения одних подстрок в другие. Были и отвлекающие факторы: BattleField2, COD4 и NFSU2 по интернету. Но в итоге у меня по запросу “Клиенты:Должности” выводились сотрудники клиентов с занимаемыми ими должностями. Но при наличии небольшого числа связей все это работало ужасно долго и требовало ручного управления поиском данных. Иначе оно могло уйти в дебри и искать очень, очень сложные структуры.
Не давеча как три дня назад меня в очередной раз осенило “объектами”. Под рукой не было компьютера и все это варилось до вчерашнего дня только в голове. А сегодня начало приобретать четкие границы. Допустим все слова – теги. Создаем связь “Клиент – (Контактные данные) (Адрес физический) – %Адрес%”. Здесь %Адрес% – это нечто что имеет собственные свойства, такие как: город, улица, номер дома и проч. При записи такой связи происходит поиск объектов: “Клиент”, “(Контактные данные) (Адрес физический)” и “%Адрес%”. Если таких объектов еще нет, то они создаются. Отдельный разговор про сложный объект “(Контактные данные) (Адрес физический)”. В связи можно указать, что он аналогичен, например, “(Данные контактные) (Адрес физический)”. При создании этого объекта ищутся объекты в него входящие: “Данные контактные” и “Адрес физический”. Если нашли – то представляем наш сложный объект как совокупность двух. Одновременно записывается, сложный объект входит в состав двух более простых (как уточнение). Таким образом при запросе “Клиент” – “Адрес” алгоритм поиска такой:
Клиент - Адрес
| пусто (нет таких данных)
|
Клиент – Адрес Физический
| пусто (так как “Адрес физический” входит в “Адрес”)
|
Клиент – (Контактные данные)(Адрес физический)
| %Адрес% (Ага! так как есть такой объект)
|
%Адрес% (заменяем найденное свойство объект значением)
| Поиск дальше не идет. Так как это и есть объект.
|
На данный момент проблема в том, что у меня поиск идет дальше и создает строки:
Клиент – (Клиент – (Контактные данные)(Адрес физический)),
Клиент – ((Контактные данные)(Адрес физический))(Адрес физический),
А из первой строки он может создать строку
(Клиент – (Контактные данные)(Адрес физический)) – Адрес.
А является ли это бредом еще стоит обдумать.