Pull to refresh

Введение в Sterling NoSQL OODB

Reading time3 min
Views1.6K
image
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().

Источники

Tags:
Hubs:
Total votes 25: ↑21 and ↓4+17
Comments4

Articles