Sterling NoSQL OODB — это легковесная объектная NoSQL БД, предназначенная для использования в проектах на .NET 4.0, Silverlight 4/5 и Windows Phone 7.
Возможности
- Работа со сложными объектами (включающими в себя другие простые или сложные объекты, которые могут включать в себя ещё объекты — и так неограниченно). В качестве объектов могут выступать как классы так и структуры.
- Работает и с полями и со свойствами.
- Возможность запрета сохранения определённого типа, свойства или поля.
- Возможности детектирования циклических ссылок.
- БД типа «in memory».
- Поддержка работы в локальных файловых системах доверенных Silverlight-приложений.
- Поддержка изолированных хранилищ данных для Silverlight и Windows Phone.
- Поддержка стандартных файловых систем для обычных десктопных приложений.
- Структура таблиц создаётся динамически на лету.
- Простое конфигурирование: указываешь тип таблицы, тип ключа и лямбда-выражение для выделения ключа — и можно полноценно работать.
- Сохранение конкретных типов при указании в описании структуры их базовых интерфейсов или абстрактных классов.
- Полная поддержка внешних ключей — дочерние объекты сохраняются в отдельных таблицах.
- Бинарный сериализатор, генерирующий меньшие по размеру объекты на диске чем JSON, XML и пр. техники.
- Поддержка шифрования.
- Поддержка сжатия.
- Поддержка всех CRUD-операций: загрузка, сохранение (асинхронное для коллекций), удаление, выравнивание и полное обнуление.
- Поддержка нескольких БД на приложение для партицирования и/или версионирования.
- Встроенная поддержка следующих типов: базовые, Nullable, строки, байтовые массивы, DateTime, TimeSpan, Guid, перечисления (Enum), Decimal, списки, словари, массивы, WritableBitmap.
- Поддержка кастомной обработки типов через написание собственных сериализаторов.
- Поддержка запросов Linq to Objects на индексах и ключах.
- Отложенная (lazy) загрузка объектов в запросах.
- Встроенное кэширование.
- Встроенный бэкап и восстановление.
- Возможность навешивания триггеров на события «перед сохранением», «после сохранения» и «удаление».
- Возможность генерирования ключа при помощи триггера.
- Возможность реализации отношений через триггеры.
- DLL весит меньше 100 кб.
Пример использования
Предположим нам нужно хранить базу данных по видам. Опишем вот такие сущности:
enum FeedingType {
Herbivore,
Carnivore,
Omnivore
}
class Feeding {
public FeedingType Type { get; set; }
public TimeSpan DefaultInterval { get; set; }
}
class Animal {
public Guid Key { get; set; }
public string Name { get; set; }
public TimeSpan LifeExpectancy { get; set; }
public Feeding Supply { get; set; }
}
* This source code was highlighted with Source Code Highlighter.
Соответственно хранить в базе мы будем объекты типа Animal.
Теперь нужно описать структуру нашей БД:
class BiologyDatabaseInstance: BaseDatabaseInstance {
public const string INDEX_ANIMAL_NAME = "idx_animal_name";
public override string Name { get { return "BiologyDb"; } }
protected override List<ITableDefinition> RegisterTables () {
// В нашей БД будет пока только одна таблица - животные.
return new List<ITableDefinition> {
CreateTableDefinition<Animal, Guid> (animal => animal.Key)
.WithIndex<Animal, string, Guid> (INDEX_ANIMAL_NAME, animal => animal.Name)
};
}
}
* This source code was highlighted with Source Code Highlighter.
В БД будет одна таблица с ключом типа Guid и индексом на наименование вида.
Теперь нам нужно собственно активировать БД:
var engine = new SterlingEngine ();
engine.Activate();
var databaseInstance = engine.SterlingDatabase.RegisterDatabase<BiologyDatabaseInstance> (
new FileSystemDriver ("C:/Temp/Animals/"));
* This source code was highlighted with Source Code Highlighter.
Вот и всё. Можно использовать. Вся работа осуществляется через экземпляр, который нам был предоставлен при регистрации. К примеру:
var catId = databaseInstance.Save (new Animal {
Key = Guid.NewGuid (),
LifeExpectancy = TimeSpan.FromDays (365 * 15),
Name = "Cat",
Supply = new Feeding {
Type = FeedingType.Carnivore,
DefaultInterval = TimeSpan.FromHours (12)
}
});
var cat = databaseInstance.Load<Animal> (catId);
var orderedAnimals = databaseInstance
.Query<Animal, string, Guid> (BiologyDatabaseInstance.INDEX_ANIMAL_NAME)
.OrderBy (x => x.Index)
.Select (x => x.LazyValue.Value);
* This source code was highlighted with Source Code Highlighter.
Заканчивать работу с БД следует вызовом метода Dispose().