Архитектура ООБД
От: shuklin  
Дата: 03.05.06 15:34
Оценка: 2 (1)
Привет Всем!

Тех кто интересуется этой темой, я хочу попросить о помощи в оценке удобства архитектуры моей ООСУБД. Что можно в ней изменить, чтобы ее интерфейсом было бы удобнее пользоваться из среды C# ?

Рассмотрим архитектуру сетевой объектно ориентированной базы знаний Cerebrum.
СУCООБЗ Cerebrum это многоуровневая система состоящая из нескольких модулей. Модули составляют иерархию, так что более высокий уровень использует в своей работе модули более низкого уровня. Это позволяет определить и использовать несколько модулей Cerebrum оптимально соответсвующих решению поставленной задачи.

Cerebrum.Runtime.dll — это ядро системы. В нем расположены самые низкоуровневые операции. Его можно рассматривать как усовершенствованный менеджер памяти и файловой системы. Например, в нем находится сборщик мусора, управляющий persistent объектами. На основе этого компонента можно реализовать различные архитектуры баз данных и знаний, однако, так как функции, реализованные в нем, достаточно низкого уровня и не определяют архитектуру приложения, использовать этот модуль независимо от остальных будет неудобно — потребуется продублировать код уже доступный в других модулях. Поэтому его удобно использовать в комплекте с несколькими вышестоящими модулями.

Cerebrum.Integrator.dll — это реализация БД конфигурации. Ядро требует метаинформацию о классах .NET управляемых системой. В нем находятся реализации дескрипторов такой метаинформации, например AttributeDescriptor, TableDescriptor, TypeDescriptor и.т.п. Этот модуль не накладывает ограничений на остальную архитектуру программы. Если необходимо использовать Cerebrum в web сайте через ASP.NET то следует ограничится использованием этого модуля, так как архитектура Windows.Forms приложения отличается от Web.

Cerebrum.Windows.Forms — это ядро приложения для Windows.Forms. Если предполагается использовать Cerebrum в своем приложении, то потребуется включить в проект эту и 2 ранее перечисленные DLL .

Cerebrum.DesktopClient.exe — это законченное приложение для просмотра и изменения БД конфигурации. Так же оно разработано с учетом поддержки add-ins. Существует возможность разработать адд-инс и включить его как составную часть Cerebrum.DesktopClient.exe. Выбор между включением Cerebrum в независимое приложение и включением приложения в Cerebrum зависит от целей разработки.


Важной особенностью СООБЗ Cerebrum является отличие в адресации объектов по сравнению с манифестом объектных баз данных ODMG. В Cerebrum каждый объект, так же ккак и в ODMG адресуется с использованием мягкого указателя или что тоже самое, ID объекта Cerebrum.Runtime.NativeHandle . Получение указателей на экземпляры объектов внешние по отношению к некторому текущему объекту производится в пределах контекста текущего объекта. Объект может адресовать только те объекты, с которыми он установил связь. Каждый связанный с текущим объект имеет идентификатор. Каждый уникальный идентификатор определяет в пределах текущего объекта экземпляр связанного с ним объекта. В пределах текущего объекта каждый идентификатор может адресовать только один экземпляр. Однако важным отличием от ODMG зедсь является возможность иметь в пределах некоторого объекта несколько различных NativeHandle адресующих один и тот же экземпляр. Тоесть в пределах некоторого заданного объекта несколько разных идентификаторов могут ссылаться на один и тот же экземпляр объекта. В отличии от ODMG, где каждый объект имеет только один уникальный идентификатор. Если рассмотреть не один экземпляр, а всю базу, то по аналогии с явлениями естественного языка синонимии и омонимии в СООБЗ Cerebrum возникаеют являения синонимии и омонимии идентификаторов объектов. Так в различных контекстах определяемых различными экземплярами объектов один и тот же идентификатор объекта NativeHandle может адресовать как разные экземпляры, так и один и тот же экземпляр. Это явление можно назвать омонимией объектных идентификаторов. Так же как и в естественном языке при омонимии один и тот же идентификатор в разных контекстах одной и той же базы данных может адресовать как различные так и одинаковые экземпляры объектов. Так же как в одном и том же контексте, так и в разных контекстах различные идентификаторы могут ссылаться на один и тот же экземпляр объекта. В этом случае возникает явление синонимии объектных идентификаторов, когда один экземпляр может иметь в пределах базы множество различных идентификаторов — синонимов. Эту возможность удобно использовать для построения семантических и иерархических семантических сетей.

С точки зрения разработчика Cerebrum представляет собой совокупность объектов различного назначения. В одном процессе возможно существование нескольких открытых баз данных. Каждая база данных доступна разработчику в виде объекта реализующего интерфейс IWorkspace. Экземпляр, реализующий этот интерфейс можно считать корнем базы данных.

public interface INativeDomain : System.IDisposable
{
    IActivator Activator { get; }

    IContainerEx GetSector();
}

public interface IWorkspace : INativeDomain, IContainer
{
    IActivator Activator { set; }

    void BeginTransaction();
    void CommitTransaction();
    NativeHandle CurrSequence();
    NativeHandle NextSequence();
    void RollbackTransaction();
    void RollbackTransaction(bool all);
}

где
Activator — свойство, позволяющее установить фабрику пользовательских объектов;
GetSector- метод, возвращающий оболочку корневого индекса пользовательских экземпляров;
NextSequence- метод, возвращающий следующий уникальный идентификатор объекта;
CurrSequence- метод, возвращающий последний сгенерированный идентификатор.

Этот объект так же обладает контекстом позволяющим проводить разадресацию идентификаторов в указатели на объекты. Разадресация производится с использованием интерфейса IContainer являющегося базовым для интерфейса IWorkspace. IWorkspace так же является оболочкой к объекту DomainContext представляющему базу данных на уровне Cerebrum.Integrator.

Интефейс IContainer содержит следующие методы:

public interface IContainer : IDisposable
{
    IComposite AttachConnector(NativeHandle plasma);
    IComposite CreateConnector(NativeHandle plasma, NativeHandle typeID);
    void EngageConnector(NativeHandle plasma, IConnector connector);
    void RemoveConnector(NativeHandle plasma);
}

где
AttachConnector — метод возвращающий объект-оболочку пользовательского объекта по идентификатору этого объекта;
CreateConnector — метод, создающий экземпляр пользовательского объекта и возвращающий его оболочку;
RemoveConnector — метод, удаляющий экземпляр пользовательского объекта из текущего контейнера. В случае удаления пользовательского объекта из всех контейнеров, объект полностью удаляется из базы данных;
EngageConnector — метод, подключающий существующий экземпляр пользовательского объекта к текущему контейнеру с заданным идентификатором.

При использовании AttachConnector или CreateConnector возвращается оболочка экземпляра IComposite. Интерфейс IComposite наследует у интерфейса IConnector. IConnector имеет следующие свойства:

public interface IConnector : IDisposable
{
    object Component { get; set; }
    IWorkspace Workspace { get; }
}

где
— свойство, возвращающее экземпляр пользовательского объекта;
— свойство возвращающее корневой интерфейс базы данных.

IComposite имеет следующие свойства:
public interface IComposite : IConnector
{
    NativeHandle GroundHandle { get; }
    NativeHandle LiquidHandle { get; }
    NativeHandle PlasmaHandle { get; }
    NativeHandle TypeIdHandle { get; }

    IConnector GetPrecedent();
}

где
— свойство, возвращающее логический идентификатор экземпляра;
— свойство, возвращающее идентификатор типа экземпляра в таблице Types.
— свойство возвращающее объект-оболочку родительского объекта;
— свойство, возвращающее идентификатор объекта в хранилище;
— свойство, возвращающее идентификатор объекта в кэш.
Контекст экземпляра определяется объектом оболочкой IConnector Если данный экземпляр имеет возможность устанавливать связи с другими объектами, то объект оболочку IConnector возможно привести к типу IContainer и использовать его для разадресации некоторого идентификатора NativeHandle вместо IWorkspace.



Модель данных СООБЗ Cerebrum представляет собой сеть.
Узел в Cerebrum является агрегатом нескольких объектов. Во первых это объект ядра. Объект ядра определяет роль данного узла в модели данных. Непосредсвенно в Cerebrum.Runtime.dll для использования пользователем доступны 3 различные типа объектов ядра. Это Scalar, Stream и Warden. Scalar объекты служат для создания узлов, хранящих скалярные значения, например System.Int32 или System.String. Такие узлы не могут вступать в связь с другими узлами в качестве родительских объектов. Или что то же самое такие узлы не могут являться источниками связей. Узлы типа Scalar могут выступать только в качестве дочерних объектов. Узлы типа Stream похожи на узлы Scalar, но в место скалярных значений они хранят потоки байт по аналогии с полем BLOB в РСУБД.
Узлы типа Warden могут быть связанны с другими узлами с помощью однонаправленных связей. Каждой связи должен быть назначен идентификатор. Из узла источника связи возможно обнаружить связанный с ним экземпляр. Однако из узла на который указывает связь невозможно определить ни узлы, их которых исходят связи, ни сам факт наличия связи. Можно сказать, что узел источник связи является родительским объектом, а узел приемник связи – дочерним. При этом нельзя для некоторого конкретного объекта определить родительский объект. Таких родительских узлов у каждого экземпляра может быть несколько. Для совместимости с паттерном FLYWEIGHT в узлах в Cerebrum не храняться ссылки на родительские узлы, и также невозможно определить идентификатор текущего объекта из внутреннего контекста этого объекта.


Вторым объектом в агрегате является экземпляр реализующий интерфейс IConnector. Этот экземпляр передается в пользовательский объект при его инициализации. Через свойство IConnector.Workspace пользовательский объект имеет доступ к экземпляру, реализущиму интерфейс IWorkspace.

Третьим объектом в агрегате является экземпляр пользовательского объекта. В Cerebrum допускается делать Persistent пользовательске объекты унаследованные от любого базового объекта. Если родительский объект получил по идентификатору адрес объекта оболочки дочернего объекта, то экземпляр дочернего пользовательского объекта доступен через свойство IConnector.Component.

Для того чтобы получить указатель на экземпляр пользовательского объекта необходимо вызвать метод AttachConnector в контексте родительского объекта, передав в качестве параметра идентификатор экземпляра, адресующий дочерний объект в пределах родительского контекста. В результате вызова данного метода система вернет новый экземпляр объекта оболочки, реализующей интерфейсы IConnector и IComposite. В случае если в качестве объекта ядра был задан Warden объект оболочка реализует так же и интерфейс IContainer

В сети нет четкого понятия иерархии. В БД любой объект может выступать как родительский и как дочерний, мало того, объекты могут быть своими собственными родительскими и дочерними объектами. Так же разрешается иметь циклы когда объект А является родительским у объекта B и объект B является родительским у объекта A. Это приводит к затруднению в определении «начала» БД с которой необходимо начать работу непосредсвенно после запуска системы. Для этого в БД реализован специальный корневой экземпляр объекта — Sector. Sector представляет собой отдельный экземпляр объекта ядра Warden. При необходимости указатель на его оболочку можно получить как IWorkspace.GetSector() однако для удобства и повышения эффективности его интерфейс IContainer совмещен с интерфейсом IWorkspace и доступен через IWorkspace напрямую.

В большинстве случаев удобно, когда дочерними узлами объекта Sector являются большинство экземпляров пользовательских объектов имеющие объекты ядра Warden. Их дочерними объектами являются скалярные значения, имеющие объекты ядра Scalar.В результате объекты ядра образуют трехуровневое дерево. На первом уровне этого дерева находится объект ядра Sector. На втором уровне находятся экземпляры пользовательских объектов, каждый узел имеет дочерние узлы. Экземпляры пользовательских объектов, находящиеся на втором уровне удобно адресовать уникальными в пределах всей базы данных идентификаторами, аналогично преложению ODMG. Для обеспечения этой возможности объект Sector предоставляет sequence для получения уникальных значений идентификаторов объектов как IWorkspace.NextSequence(). На третьем уровне находятся скалярные значения, представляющие собой аттрибуты пользовательских объектов. Дочерние узлы в пределах узла пользовательского экземпляра адресуются с помощью идентификаторов NativeHandle. Если пользовательские объекты имеют уникальные идентификаторы в пределах объекта Sector то их аттрибуты имеют уникальные идентификаторы только в пределах одного экземпляра. Аттрибуты различных пользовательских объектов обладающие одинаковой семантикой имеют одинаковые идентификаторы. Можно провести аналогию с XML в котором у каждого узла есть дочерние узлы имеющие некоторое имя. Тоесть именем объекта в пределах некоторого узла выступает идентификатор этого объекта.

Пользовательские классы удобно наследовать от класса GenericComponent. У каждого GenericComponent есть свойство DomainContext. Это свойство возвращает эеземпляр класса DomainContext представляющий базу данных модуля Cerebrum.Integrator Метод GetChildComponents доступен из нутри пользовательского объекта и возвращает экземпляр класса, реализующий интерфейс IContainer. Это позволяет проводить разадресацию указателей на дочерние объекты из нутри пользовательского экземпляра не имея доступа к объекту оболчке возвращаемому AttachConnector/CreateConnector.

Для удобства работы в Cerebrum реализованны коллекции объектов, называемые таблицами. Таблицы позволяют редактировать аттрибуты (скалярные объекты 3 го уровня) объектов-строк (warden объекты 2го уровня).

Итак в пределах некоторого узла возможно содание дочерних объектов, адресуемых в пределах этого узла некоторыми NativeHandle. Эти ид могут быть одинаковыми для разных дочерних объектов в пределах разных родительских объектов. Это позволяет устанавливать реляционную связь (по значению) между дочерними объектами разного уровня разных родительских объектов.

При создании аттрибутов создаются экземпляры объектов AttributeDescriptor как дочерние объекты корневого объекта БД. Этим объектам присваиваются уникальные в пределах корневого объекта значения ИД получаемые с помощью sector.NextSequence() Далее пользуясь этими ИД как именами экземпляров объектов второго уровня упользовательских объектов создаются аттрибуты имеющие ИД равные соответсвующим дескрипторам аттрибутов.

Таблица есть две коллекции объектов — объектов аттрибутов и объектов компонентов. Она автоматизирует процесс присвоения объектам значений аттрибутов на основе идентификаторов описателей аттрибутов. Таким образом экземпляры пользовательских объектов имеют дочерние объекты с одинаковыми ИД аттрибутов.


Если когото заинтересовала такая ОБД, то текущую версию можно скачать по адресу http://www.shuklin.com/ai/ht/ru/cerebrum/

Добавлено форматирование. IT.
Re: Архитектура ООБД
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.05.06 01:55
Оценка: +1
Здравствуйте, shuklin, Вы писали:

S>Привет Всем!


S>Тех кто интересуется этой темой, я хочу попросить о помощи в оценке удобства архитектуры моей ООСУБД. Что можно в ней изменить, чтобы ее интерфейсом было бы удобнее пользоваться из среды C# ?

Не хочешь оформить этот постинг в стиле статьи RSDN? Есть довольно-таки удобный шаблон Word (http://rsdn.ru/?article/authors/template.xml
Автор(ы): Брусенцев Виталий, Чистяков Владислав Юрьевич
Дата: 22.06.2011
Статья описывает шаблон для Microsoft Word предназначенный для верстки статей и преобразования их в формат RSDN ML. В статье рассматриваются вопросы использования шаблона.
), который поддерживает более богатое форматирование, чем язык разметки постингов, и гораздо удобнее в использовании, чем текстовый редактор.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Архитектура ООБД
От: shuklin  
Дата: 04.05.06 10:37
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Не хочешь оформить этот постинг в стиле статьи RSDN?


Сделаю. Поработаю над ним еще.
Re[2]: Архитектура ООБД
От: shuklin  
Дата: 10.05.06 11:59
Оценка: 46 (1)
Здравствуйте, Sinclair, Вы писали:

S>Не хочешь оформить этот постинг в стиле статьи RSDN? Есть довольно-таки удобный шаблон Word (http://rsdn.ru/?article/authors/template.xml
Автор(ы): Брусенцев Виталий, Чистяков Владислав Юрьевич
Дата: 22.06.2011
Статья описывает шаблон для Microsoft Word предназначенный для верстки статей и преобразования их в формат RSDN ML. В статье рассматриваются вопросы использования шаблона.
),


Сделал и выслал в редакцию.
Re[3]: Архитектура ООБД
От: shuklin  
Дата: 10.09.08 09:17
Оценка:
Опубликовал Cerebrum version 1.0.300.12, build 2008-09-07

Основные изменения:

— Проведенна небольшая оптимизация кода и рефакторинг;

— Усовершенствованна поддержка многопоточности. Теперь ядро Cerebrum защищено Win32 CriticalSection. Все вызовы ядра из C# кода синхронизируются с ее исспользованием.

— Добавлен .NET 2.0 модуль Cerebrum.Runtime.Finalizer.dll , обеспечивающий выполнение модуля Enterprise\Cerebrum.Ganglion.Ensemble.dll под управлением механизма .NET Critical Execution Region ;

— Добавленна новая редакция ядра. Старая редакция ядра Stress осталась без изменений. Старая редакция ядра Retail переименованна в Robust, текущий Retail представляет собой редакцию Robust из которой удалены рантайм проверки корректности параметров внутренних функций, что незначительно увеличивает ее производительность.

ВНИМАНИЕ: Теперь все callback вызовы осуществляются ядром из синхронизированного кода, для предотвращения deadlocks избегать вызова метода System.GC.WaitForPendingFinalizers из кода, получившего управление через callback (в основном это метод IComponent.SetConnector)
Re: Архитектура ООБД
От: prVovik Россия  
Дата: 10.09.08 09:47
Оценка: 1 (1)
Здравствуйте, shuklin, Вы писали:

S>Привет Всем!


S>Тех кто интересуется этой темой, я хочу попросить о помощи в оценке удобства архитектуры моей ООСУБД. Что можно в ней изменить, чтобы ее интерфейсом было бы удобнее пользоваться из среды C# ?


Неплохо было бы начать с описания задач, которые ставились перед архитектурой, для чего она вообще нужна, какие есть альтернативы и чем она лучше альтернатив.
лэт ми спик фром май харт
Re[4]: Архитектура ООБД
От: Lloyd Россия  
Дата: 10.09.08 13:46
Оценка:
Здравствуйте, shuklin, Вы писали:

S>- Усовершенствованна поддержка многопоточности. Теперь ядро Cerebrum защищено Win32 CriticalSection. Все вызовы ядра из C# кода синхронизируются с ее исспользованием.


Фига се. Зачем?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[5]: Архитектура ООБД
От: shuklin  
Дата: 10.09.08 14:40
Оценка:
Здравствуйте, Lloyd, Вы писали:

S>>- Усовершенствованна поддержка многопоточности. Теперь ядро Cerebrum защищено Win32 CriticalSection. Все вызовы ядра из C# кода синхронизируются с ее исспользованием.


L>Фига се. Зачем?


в среде ASP.NET без поддержки многопоточности тоскливо. Раньше приходилось в ручную на каждое движение lock(чегото.SyncRoot) делать. Теперь будет легче. К тому же если не следить за временем жизни объектов-оболочек, их деструкторы .NET собирает в отдельном потоке, многопоточность тоже нужна. В предыдущих версиях только отдельные части ядра были закрыты CriticalSection. В текущей закрыто все ядро. Если нигде не наплужил, то теперь из среды C# можно спокойно работать с многопоточностью.

На данный момент еще остается известная проблема эксплуатации в среде ASP.NET, связанная с тем, что финализеры объектов вне CER срабатывают не гарантированно, но последние изменения значительно облегчили ситуацию.
Re[6]: Архитектура ООБД
От: Lloyd Россия  
Дата: 10.09.08 14:44
Оценка:
Здравствуйте, shuklin, Вы писали:

L>>Фига се. Зачем?


S>В предыдущих версиях только отдельные части ядра были закрыты CriticalSection. В текущей закрыто все ядро. Если нигде не наплужил, то теперь из среды C# можно спокойно работать с многопоточностью.


Тем самым вы многопоточность-то и убили. Все запросы к вашей системе будут выстраиваться в очередь на обработку.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: Архитектура ООБД
От: shuklin  
Дата: 10.09.08 14:45
Оценка:
Здравствуйте, prVovik, Вы писали:

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


Начало разработки было мотивированно необходимостью иметь платформу для отладки и исследования моделей семантических нейронных сетей. В результате разработки получившийся продукт оказался достаточно универсальным, чтобы быть полезным при решении задач не только в области Искусственного Интеллекта. Более подробно с теми задачами, которыми я занимаюсь можно ознакомится на моей домашней странице http://www.shuklin.com/ai/ht/ru/cybernetics.aspx
Re[7]: Архитектура ООБД
От: shuklin  
Дата: 10.09.08 15:00
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Тем самым вы многопоточность-то и убили. Все запросы к вашей системе будут выстраиваться в очередь на обработку.


Это лучше чем получать вылеты системы. Меня на данном этапе гораздо сильнее напрягает неуправляемость уничтожения домена в пууле IIS и отсутствие гарантии вызова финализеров объектов вне CER, чем наличие очереди на обработку. Кстати, производительность системы этим решением с критической секцией даже немного повысилась по сравнению с предыдущей версией. В предыдущей версии блокировки ставились на критические для системы участки кода, что снимало проблему с финализацией объектов в другом треде. Однако эти же участки многократно и иногда реентрантно вызываются из другого кода. В результате колличество входов/выходов из критических секций было значительно больше необходимого. Теперь вход/выход почти всегда только один и не нужно тратить время на ненужные входы/выходы их критической секции. Я на этом решении получил примерно пол процента выигрыша по сравнению с предыдущей версией. Ну а стабильность значительно выросла. Хотя реализовать свободную модель было бы более красиво. Можно было бы за счет многоядерности получить еще больший выигрышь. Это у меня запланированно на перспективы.
Re: Архитектура ООБД
От: vdimas Россия  
Дата: 06.10.08 11:02
Оценка:
Здравствуйте, shuklin, Вы писали:

А как обеспечивается целостность данных, например при сбое аппаратуры? Есть ли журналирование? Транзакции? Как обеспечивается "единство" кода и данных? Где хранятся сборки, в которых содержатся методы персистентных объектов? Что с безопасностью? Пользователями и ролями?

Почему бы не сделать свой сервер ООБД на основе некоего in-process надёжного реляционного сервера данных? Например, MS SQL Compact — очень неплохой кандидат для такой in-process базы данных. Для своей ООБД нужно было бы отказаться от поставляемого ропера для ADO.Net (он крайне неэффективный, к тому же содержит баги), взять "шустрый" маппинг из BLT, вызывать OLEDB-интерфейсы напрямую (я бы С++/CLI взял для этой части), и тем самым _задёшево_ сделать по-настоящему эффективную и так же по-настоящему надёжную персистентную часть.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[2]: Архитектура ООБД
От: shuklin  
Дата: 06.10.08 18:59
Оценка: 7 (1)
Здравствуйте, vdimas, Вы писали:

В текущей версии :

V>А как обеспечивается целостность данных, например при сбое аппаратуры?


Не обеспечивается.

V>Есть ли журналирование?


Нет, и не планируется, я не сторонник этой идеи в принципе. Теже возможности, считаю, следует в ООБД реализовывать другими способами. Если о надежности то клонированием страниц, на подобии последнего MS-SQL.

V>Транзакции?


В однопользовательской модели есть undo/redo. Т.е. можно выполнить несколько begin transaction, затем можно выполнять ряд roll back, после чего отменить роллбаки, выполнив ряд roll forward.

V>Как обеспечивается "единство" кода и данных?


Эта проблема решена отменой самого понятия "единства". В разработанной ОО СУБД код и данные существуют в различных контекстах. Единства нет по определению, и поддерживать его следовательно не нужно и даже вредно. Код имеет доступ к данным, предсавленным в СУБД в сетевой модели, используя соответсвующее АПИ.

V>Где хранятся сборки, в которых содержатся методы персистентных объектов?

СУБД in-process — в корневом каталоге приложения.

V>Что с безопасностью?


Стандартные средства отсутсвуют тоже по определению, т.к. движек однопользовательский. Т.е. по определению никаких блокировок, конкуренции и т.п. быть не может в силу ограничений реализации по определению. При необходимости реализация этого механизма оставлена разработчику приложения, средствами приложения.

V> Пользователями и ролями?


Мне этот функционал понадобился только в одном приложении, поэтому в самой БД никаких средств для поддержки пользователей и ролей еще не появилось. И видимо не появиться. Вероятно, когда нибудь опубликую отдельный адд-ин с helper функциями для этого дела.

V>Почему бы не сделать свой сервер ООБД на основе некоего in-process надёжного реляционного сервера данных? Например, MS SQL Compact — очень неплохой кандидат для такой in-process базы данных. Для своей ООБД нужно было бы отказаться от поставляемого ропера для ADO.Net (он крайне неэффективный, к тому же содержит баги), взять "шустрый" маппинг из BLT, вызывать OLEDB-интерфейсы напрямую (я бы С++/CLI взял для этой части), и тем самым _задёшево_ сделать по-настоящему эффективную и так же по-настоящему надёжную персистентную часть.


Я не против, если оно такое комуто надо. Мне, в силу моих интересов, такая система не нужна даже в полностью готовом и отлаженном виде.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.