WinFS (сокращение от Windows Future Storage ) [1] — кодовое название отмененного [2] проекта системы хранения и управления данными на основе реляционных баз данных , разработанной корпорацией Microsoft и впервые продемонстрированной в 2003 году. Она была задумана как усовершенствованная подсистема хранения для операционной системы Microsoft Windows , предназначенная для сохранения и управления структурированными , полуструктурированными и неструктурированными данными .
WinFS включает в себя реляционную базу данных для хранения информации и позволяет хранить в ней любой тип информации при условии, что для типа есть четко определенная схема . Отдельные элементы данных затем могут быть связаны друг с другом отношениями, которые либо выводятся системой на основе определенных атрибутов, либо явно указываются пользователем. Поскольку данные имеют четко определенную схему, любое приложение может повторно использовать данные; и используя отношения, связанные данные могут быть эффективно организованы, а также извлечены. Поскольку система знает структуру и назначение информации, ее можно использовать для создания сложных запросов, которые позволяют выполнять расширенный поиск по данным и агрегировать различные элементы данных, используя отношения между ними.
Хотя WinFS и ее общая схема типов позволяют приложению распознавать различные типы данных, приложение все равно должно быть закодировано для отображения различных типов данных. Следовательно, это не позволит разработать единое приложение, которое может просматривать или редактировать все типы данных; скорее, WinFS позволяет приложениям понимать структуру всех данных и извлекать информацию, которую они могут использовать в дальнейшем. Когда WinFS была представлена на конференции профессиональных разработчиков 2003 года , Microsoft также выпустила видеопрезентацию под названием IWish [3], показывающую макеты интерфейсов, которые показывают, как приложения будут предоставлять интерфейсы, использующие преимущества единой системы типов. Концепции, показанные в видео, варьировались от приложений, использующих отношения элементов для динамического предложения параметров фильтрации, до приложений, группирующих несколько связанных типов данных и отображающих их в едином представлении.
WinFS была объявлена одним из столпов волны технологий "Longhorn" и должна была быть частью следующей версии Windows. Впоследствии было решено, что WinFS будет поставляться после выпуска Windows Vista , но эти планы были отложены в июне 2006 года, [4] а некоторые из ее компонентных технологий были интегрированы в ADO.NET и Microsoft SQL Server . [5]
Многие файловые системы , найденные в распространенных операционных системах , включая файловую систему NTFS , которая используется в современных версиях Microsoft Windows, хранят файлы и другие объекты только как поток байтов и имеют мало или вообще не имеют информации о данных, хранящихся в файлах. Такие файловые системы также предоставляют только один способ организации файлов, а именно через каталоги и имена файлов. [6] [7]
Поскольку файловая система не имеет сведений о хранимых ею данных, [6] приложения, как правило, используют свои собственные, часто фирменные , форматы файлов . Это затрудняет совместное использование данных между несколькими приложениями. Становится сложно создать приложение, которое обрабатывает информацию из нескольких типов файлов, поскольку программисты должны понимать структуру и семантику всех файлов. [8] Использование общих форматов файлов является обходным путем для этой проблемы, но не универсальным решением; нет гарантии, что все приложения будут использовать этот формат. Данные со стандартизированной схемой, такие как XML- документы и реляционные данные, справляются лучше, поскольку они имеют стандартизированную структуру и требования к времени выполнения. [9]
Кроме того, традиционная файловая система может извлекать и искать данные, основываясь только на имени файла, поскольку единственное, что она знает о данных, — это имя файла, в котором хранятся данные. [8] Лучшим решением будет пометить файлы атрибутами, которые их описывают. Атрибуты — это метаданные о файлах, такие как тип файла (например, документ , изображение , музыка , создатель и т. д.). [6] Это позволяет искать файлы по их атрибутам способами, которые невозможны с использованием иерархии папок, например, поиск «изображений, в которых есть человек X» . Атрибуты могут быть распознаны либо файловой системой изначально, либо через некоторое расширение. [6] Приложения для поиска на рабочем столе продвигают эту концепцию на шаг дальше. Они извлекают данные, включая атрибуты, из файлов и индексируют их. Для извлечения данных они используют фильтр для каждого формата файла. Это позволяет выполнять поиск как на основе атрибутов файла, так и данных в нем. [6]
Однако это все еще не помогает в управлении связанными данными, поскольку разрозненные элементы не имеют никаких определенных связей. Например, невозможно выполнить поиск по запросу «телефонные номера всех лиц, которые живут в Акапулько и каждый из которых встречается в моей коллекции фотографий более 100 раз и от которых я получал электронные письма в течение последнего месяца» . Такой поиск не может быть выполнен, если он не основан на модели данных, в которой определены как семантика , так и связи данных. [6] [7] WinFS стремится предоставить такую модель данных и инфраструктуру времени выполнения, которые могут использоваться для хранения данных, а также связи между элементами данных в соответствии с моделью данных, делая это на удовлетворительном уровне производительности.
WinFS изначально распознает различные типы данных, такие как picture , e-mail , document , audio , video , calendar , contact , а не просто оставляет их как сырые неанализированные потоки байтов (как это делают большинство файловых систем). Данные, хранящиеся и управляемые системой, являются экземплярами типа данных, распознаваемого средой выполнения WinFS. Данные структурированы с помощью свойств. Например, экземпляр типа резюме будет отображать данные, предоставляя свойства, такие как Name , Educational Qualification , Experience . Каждое свойство может быть простым типом ( строки , целые числа , даты ) или сложными типами ( контакты ). [8] [10] Различные типы данных предоставляют различные свойства. Кроме того, WinFS также позволяет связывать различные экземпляры данных; например, документ и контакт могут быть связаны отношением Authored By . [7] [10] Отношения также предоставляются как свойства; например, если документ связан с контактом отношением Created By , то документ будет иметь свойство Created By . При доступе к нему отношение просматривается и возвращаются связанные данные. [10] Следуя отношениям, можно получить доступ ко всем связанным данным. [7] WinFS способствует совместному использованию данных между приложениями, делая типы данных доступными для всех приложений вместе с их схемами. [8] Когда приложение хочет использовать тип WinFS, оно может использовать схему для поиска структуры данных и может использовать информацию. Таким образом, приложение имеет доступ ко всем данным в системе, даже если разработчику не пришлось писать синтаксические анализаторы для распознавания различных форматов данных. Оно также может использовать отношения и связанные данные для создания динамических фильтров для представления информации, с которой работает приложение. API WinFS еще больше абстрагирует задачу доступа к данным. Все типы WinFS представлены как объекты .NET, при этом свойства объекта напрямую отображаются на свойства типа данных. [6] Кроме того, позволяя разным приложениям, работающим с одними и теми же данными, совместно использовать один и тот же экземпляр данных WinFS, а не хранить одни и те же данные в разных файлах, устраняются трудности синхронизации разных хранилищ при изменении данных. [11] Таким образом, WinFS может сократить избыточность. [6] [9]
Доступ ко всем данным в системе позволяет выполнять сложный поиск данных по всем элементам данных, управляемым WinFS. В приведенном выше примере ( «телефонные номера всех лиц, которые живут в Акапулько и каждый из которых встречается в моей коллекции фотографий более 100 раз и с которыми у меня была электронная почта в течение последнего месяца» ), WinFS может просматривать предметную связь всех фотографий, чтобы найти элементы контактов . Аналогичным образом, он может фильтровать все электронные письма за последний месяц и получать доступ к коммуникационным отношениям , чтобы добраться до контактов. Затем общие контакты можно вычислить из двух наборов результатов, а их номер телефона извлечь, обратившись к подходящему свойству элементов контактов.
В дополнение к полностью схематизированным данным (таким как XML и реляционные данные), WinFS поддерживает полуструктурированные данные (такие как изображения, которые имеют неструктурированный поток битов плюс структурированные метаданные), а также неструктурированные данные (такие как файлы). Он хранит неструктурированные компоненты как файлы, а структурированные метаданные — в структурированном хранилище. [10] Внутри WinFS использует реляционную базу данных для управления данными. Она не ограничивает данные принадлежностью к какой-либо конкретной модели данных. Среда выполнения WinFS сопоставляет схему с реляционной модальностью, [6] определяя таблицы, в которых она будет хранить типы, а также первичные ключи и внешние ключи , которые потребуются для представления отношений. WinFS по умолчанию включает сопоставления для объектных и XML-схем. Сопоставления для других схем должны быть указаны. Схемы объектов указаны в XML; WinFS генерирует код для отображения схем как классов .NET . ADO.NET можно использовать для прямого указания реляционной схемы, хотя для ее отображения в виде классов необходимо предоставить сопоставление со схемой объектов. [10] Обходы отношений выполняются как объединения в этих таблицах. WinFS также автоматически создает индексы в этих таблицах, чтобы обеспечить быстрый доступ к информации. [10] Индексирование значительно ускоряет объединения, а обход отношений для извлечения связанных данных выполняется очень быстро. Индексы также используются во время поиска информации; поиск и запросы используют индексы для быстрого завершения операций, во многом как в системах поиска на рабочем столе .
Разработка WinFS является расширением функции, которая изначально планировалась в начале 1990-х годов. Названная Object File System , она должна была быть включена как часть Cairo . OFS должна была иметь мощные функции агрегации данных, [12] но проект Cairo был отложен, а вместе с ним и OFS. Однако позже, во время разработки COM , была запланирована система хранения данных Storage+, основанная на тогда еще готовящемся SQL Server 8.0, которая должна была предлагать аналогичные функции агрегации. [12] Это также так и не было реализовано, и похожая технология, Relational File System (RFS), была задумана для запуска с SQL Server 2000. [12] Однако SQL Server 2000 оказался незначительным обновлением SQL Server 7.0, и RFS не был реализован.
Концепция не была отвергнута и послужила основой для WinFS. [12] Изначально WinFS планировалось включить в Windows Vista , [14] и сборка 4051 Windows Vista, тогда называвшаяся кодовым именем «Longhorn», данным разработчикам на конференции Microsoft Professional Developers Conference в 2003 году, включала WinFS, но она страдала от значительных проблем с производительностью. [12] В августе 2004 года Microsoft объявила, что WinFS не будет поставляться с Windows Vista; вместо этого она будет доступна в качестве загружаемого обновления после выпуска Vista. [12]
29 августа 2005 года [12] Microsoft тихо сделала Beta 1 WinFS доступной подписчикам MSDN. Она работала на Windows XP и требовала для работы .NET Framework . WinFS API был включен в пространство имен System.Storage . [15] Бета-версия была обновлена 1 декабря 2005 года для совместимости с версией 2.0 .NET Framework. [16] WinFS Beta 2 планировалась на некоторое время позже в 2006 году [17] и должна была включать интеграцию с Windows Desktop Search , чтобы результаты поиска включали результаты как из обычных файлов, так и из хранилищ WinFS, а также позволяли доступ к данным WinFS с помощью ADO.NET . [18]
23 июня 2006 года команда WinFS в Microsoft объявила, что WinFS больше не будет поставляться как отдельный продукт, [4] [19] а некоторые компоненты будут включены в другие технологии. Многие из основных функций, которые Microsoft намеревалась предоставить с WinFS, включали панель для редактирования свойств метаданных, навигацию по свойствам на основе навигационной цепочки , фильтрацию или наложение элементов на свойства, инкрементный поиск и сохраненные поиски ; [20] эти функции были включены в Windows Vista. [21] Составление запроса , функция WinFS, которая позволяла пользователям выполнять дополнительные поиски, которые повторно используют результаты предыдущего запроса, [22] была позже включена в Windows Vista. [23]
Примерами использования этой технологии являются компоненты объектно-реляционного отображения в ADO.NET Entity Framework ; поддержка неструктурированных данных, режим работы без администратора, поддержка объектов файловой системы через FILESTREAM
тип данных и иерархические данные в SQL Server 2008 , тогда имевшем кодовое название Katmai , а также интеграция с Win32 API и Windows Shell и поддержка обхода иерархий путем обхода отношений в более поздних выпусках Microsoft SQL Server ; [5] и компоненты синхронизации в Microsoft Sync Framework . [5]
В 2013 году Билл Гейтс назвал WinFS своим самым большим разочарованием в Microsoft и сказал, что идея WinFS опередила свое время и что она вновь появится. [24]
WinFS использует реляционный движок, который происходит от SQL Server 2005, [25] чтобы обеспечить механизм отношений данных. Хранилища WinFS — это просто файлы базы данных SQL Server (.MDF) с набором атрибутов FILESTREAM. [26] Эти файлы хранятся в папке с ограниченным доступом под названием «System Volume Information» (расположенной в корне тома), [27] в папках под папкой «WinFS» с именами GUID этих хранилищ. [26]
Внизу стека WinFS находится WinFS Core , который взаимодействует с файловой системой и обеспечивает доступ к файлам и возможности адресации. [8] Реляционный движок использует службы ядра WinFS для представления структурированного хранилища и других служб, таких как блокировка , которые среда выполнения WinFS использует для реализации функциональности. Среда выполнения WinFS предоставляет службы , такие как синхронизация и правила , которые могут использоваться для синхронизации хранилищ WinFS или выполнения определенных действий при возникновении определенных событий. [8]
WinFS работает как служба , которая запускает три процесса : [28]
Он обеспечивает программный доступ к своим функциям через набор API .NET Framework . Они позволяют приложениям определять пользовательские типы данных, определять связи между данными, хранить и извлекать информацию, а также разрешать расширенный поиск. [6] [8] Затем приложения могут агрегировать данные и представлять агрегированные данные пользователю.
WinFS хранит данные в реляционных хранилищах, которые представлены как виртуальные расположения, называемые хранилищами . [12] Хранилище WinFS — это общий репозиторий, в котором любое приложение может хранить данные вместе со своими метаданными, связями и схемой. Среда выполнения WinFS может сама применять определенные связи; например, если значения свойства субъекта изображения и свойства имени контакта одинаковы, то WinFS может связать контакт с изображением. [29] Связи также могут быть указаны другими приложениями или пользователем. [30]
WinFS предоставляет унифицированное хранилище, но не определяет формат, который должен храниться в хранилищах данных. Вместо этого он поддерживает запись данных в форматах, специфичных для приложений. Но приложения должны предоставлять схему , которая определяет, как формат файла должен интерпретироваться. [6] Например, можно добавить схему, чтобы WinFS понимала, как читать и, таким образом, могла искать и анализировать, (скажем) файл PDF . Используя схему, любое приложение может читать данные из любого другого приложения, и это также позволяет различным приложениям писать в формате друг друга, разделяя схему. [30]
Несколько хранилищ WinFS могут быть созданы на одной машине. [30] Это позволяет хранить различные классы данных отдельно; например, официальные документы и личные документы могут храниться в разных хранилищах. WinFS по умолчанию предоставляет только одно хранилище с именем «DefaultStore». [12] Хранилища WinFS представлены как объекты оболочки, похожие на виртуальные папки , которые динамически генерируют список всех элементов, присутствующих в хранилище, и представляют их в виде папки. Объект оболочки также позволяет искать информацию в хранилище данных. [12]
Единица данных, которая должна храниться в хранилище WinFS, называется элементом WinFS . [6] [30] Элемент WinFS, наряду с основным элементом данных, также содержит информацию о том, как элемент данных связан с другими данными. Эта связь хранится в терминах логических ссылок. Ссылки указывают, с какими другими элементами данных связан текущий элемент. Другими словами, ссылки указывают связь данных с другими элементами данных. Ссылки физически хранятся с использованием идентификатора ссылки, который указывает имя и цель связи, например, тип или состоит из . [6] Идентификатор ссылки хранится как атрибут элемента данных. Все объекты, имеющие одинаковый идентификатор ссылки, считаются связанными. [6] XML-схема , определяющая структуру элементов данных, которые будут храниться в WinFS, должна быть предоставлена среде выполнения WinFS заранее. [6] В Beta 1 WinFS сборка схемы должна была быть добавлена в GAC, прежде чем ее можно было использовать.
WinFS моделирует данные, используя элементы данных, а также их взаимосвязи , расширения и правила, регулирующие их использование. [8] WinFS необходимо понимать тип и структуру элементов данных, чтобы информация, хранящаяся в элементе данных, могла быть доступна любому приложению, которое ее запрашивает. Это делается с помощью схем. Для каждого типа элемента данных, который должен храниться в WinFS, необходимо предоставить соответствующую схему для определения типа, структуры и ассоциаций данных. Эти схемы определяются с помощью XML . [6]
Предопределенные схемы WinFS включают схемы для документов, электронной почты, встреч, задач, мультимедиа, аудио, видео, а также включают системные схемы, которые включают конфигурацию, программы и другие системные данные. [8] Пользовательские схемы могут быть определены для каждого приложения в ситуациях, когда приложение хочет хранить свои данные в WinFS, но не делиться структурой этих данных с другими приложениями, или они могут быть доступны по всей системе. [8]
Самое важное различие между файловой системой и WinFS заключается в том, что WinFS знает тип каждого элемента данных, который она хранит. А тип определяет свойства элемента данных. Система типов WinFS тесно связана с концепцией классов и наследования .NET Framework . Новый тип может быть создан путем расширения и вложения любых предопределенных типов. [6]
WinFS предоставляет четыре предопределенных базовых типа – Items , Relationships , ScalarTypes и NestedTypes . [6] Item – это фундаментальный объект данных, который может быть сохранен, а Relationship – это отношение или связь между двумя элементами данных. Поскольку все элементы WinFS должны иметь тип, тип сохраненного элемента определяет его свойства. Свойствами Item могут быть ScalarType, который определяет наименьшую единицу информации, которую может иметь свойство, или NestedType, который представляет собой коллекцию из более чем одного ScalarTypes и/или NestedTypes. Все типы WinFS доступны как классы .NET CLR . [30]
Любой объект, представленный как единица данных, например контакт, изображение, видео, документ и т. д., может храниться в хранилище WinFS как специализация типа элемента. [30] По умолчанию WinFS предоставляет типы элементов для файлов, контактов, документов, изображений, аудио, видео, календаря и сообщений. Элемент файла может хранить любые общие данные, которые хранятся в файловых системах как файлы. Но если для файла не предоставлена расширенная схема, определяющая его как специализированный элемент, WinFS не сможет получить доступ к его данным. Такой элемент файла может поддерживать только связь с другими элементами. [6]
Разработчик может расширить любой из этих типов или базовый тип Item, чтобы предоставить тип для своих пользовательских данных. Данные, содержащиеся в Item, определяются в терминах свойств или полей, которые содержат фактические данные. Например, Item Contact может иметь поле Name , которое является ScalarType, и одно поле Address , NestedType, которое далее состоит из двух ScalarType. Чтобы определить этот тип, базовый класс Item расширяется, и в класс добавляются необходимые поля. [6] Поле NestedType может быть определено как другой класс, содержащий два поля ScalarType. После определения типа необходимо определить схему, которая обозначает примитивный тип каждого поля, например, поле Name является String, поле Address является пользовательским определенным классом Address, оба поля которого являются String. Другими примитивными типами, которые поддерживает WinFS, являются Integer , Byte , Decimal , Float , Double , Boolean и DateTime, среди прочих. [6] Схема также определит, какие поля являются обязательными, а какие — необязательными. [31] Элемент контакта, определенный таким образом, будет использоваться для хранения информации о контакте путем заполнения поля свойств и его сохранения. Только поля, отмеченные как обязательные, должны быть заполнены во время первоначального сохранения. [30] Другие поля могут быть заполнены пользователем позже или не заполнены вообще. Если необходимо добавить больше полей свойств, таких как дата последнего разговора , этот тип можно расширить для их размещения. Типы элементов для других данных можно определить аналогичным образом.
WinFS создает таблицы для всех определенных элементов. [31] Все поля, определенные для элемента, формируют столбцы таблицы, и все экземпляры элемента хранятся в виде строк в таблице для соответствующих элементов. Всякий раз, когда какое-либо поле в таблице ссылается на данные в какой-либо другой таблице, это считается связью. Схема связи определяет, какие таблицы задействованы, а также каков вид и имя связи. Среда выполнения WinFS управляет схемами связей. [30] Все элементы представлены как объекты .NET CLR с единым интерфейсом, обеспечивающим доступ к данным, хранящимся в полях. Таким образом, любое приложение может извлекать объект любого типа элемента и использовать данные в объекте, не зная о физической структуре, в которой хранились данные. [6]
Типы WinFS представлены как классы .NET, которые могут быть созданы как объекты .NET. Данные хранятся в этих экземплярах типов путем установки их свойств. После этого они сохраняются в хранилище WinFS. Доступ к хранилищу WinFS осуществляется с помощью класса ItemContext (подробнее см. в разделе Извлечение данных). ItemContext обеспечивает транзакционный доступ к хранилищу WinFS; т. е. все операции с момента привязки объекта ItemContext к хранилищу до его закрытия либо все завершаются успешно, либо все откатываются. По мере внесения изменений в данные они не записываются на диск; вместо этого они записываются в журнал в памяти. Только когда соединение закрывается, изменения записываются на диск в пакетном режиме. Это помогает оптимизировать дисковый ввод-вывод. [10] Следующий фрагмент кода, написанный на C# , создает контакт и сохраняет его в хранилище WinFS.
//Подключение к хранилищу WinFS по умолчанию с помощью ( ItemContext ic = ItemContext.Open ()) { //Создание контакта и установка данных в соответствующих свойствах ContactEAddress contact = new ContactEAddress () { Name = new PersonName () { // Имя имеет тип ComplexType Displayname = "Doe, John" , FirstName = "John" , LastName = "Doe" }, TelephoneNumber = new TelephoneNumber () { // Номер телефона имеет тип ComplexType Country = CountryCode.Antarctica , Areacode = 4567 , Number = 9876543210 }, Age = 111 // Возраст имеет тип SimpleType } ; //Добавляем объект в личную папку пользователя. //Это связывает элемент с псевдотипом Folder для обратной совместимости, поскольку это позволяет //получить доступ к элементу в иерархии папок для приложений, которые не являются собственными для WinFS. Folder containFolder = UserDataFolder . FindMyPersonalFolder (); containFolder . OutFolderMemberRelationship . AddItem ( ic , contact ); //Найти документ и установить связь с документом. Поиск начинается с создания объекта //ItemSearcher. Каждый объект типа WinFS содержит метод GetSearcher(), //который генерирует объект ItemSearcher, который ищет документы этого типа. using ( ItemSearcher searcher = Document . GetSearcher ( ic )) { Document d = searcher . Find ( @"Title = 'Some Particular Document'" ); d . OutAuthoringRelationship . AddItem ( ic , contact ); } //Поскольку необходимо найти только один документ, можно также использовать метод ItemContext. FindOne(). // Найти изображение и связать его с помощью ( ItemSearcher searcher = Picture.GetSearcher ( ic ) ) { Picture p = searcher.Find ( @" Occasion = 'Graduation' and Sequence = '3 ' " ) ; p.OutSubjectRelationship.AddItem ( ic , contact ) ; } //Сохраняемся в хранилище и закрываем ссылку на хранилище ic . Update (); }
Данные могут быть связаны с еще одним элементом, что приводит к отношению «один к одному», или с несколькими элементами, что приводит к отношению «один ко многим». [6] Связанные элементы, в свою очередь, могут быть связаны с другими элементами данных, что приводит к сети отношений, которая называется отношением «многие ко многим». Создание отношения между двумя элементами создает еще одно поле в данных соответствующих элементов, которое ссылается на строку в таблице другого элемента, где хранится связанный объект. [30]
В WinFS Relationship — это экземпляр базового типа Relationship, который расширен для обозначения специализации отношения. Relationship — это сопоставление между двумя элементами, Source и Target. Источник имеет Outgoing Relationship, тогда как цель получает Incoming Relationship. [31] WinFS предоставляет три типа примитивных отношений — Holding Relationship , Reference Relationship и Embedding Relationship . [6] Любые пользовательские отношения между двумя типами данных являются экземплярами этих типов отношений.
Отношения между двумя элементами могут быть установлены программно приложением, создающим данные, или пользователь может использовать WinFS Item Browser, чтобы вручную связать элементы. [31] WinFS Item Browser также может графически отображать элементы и то, как они связаны, чтобы пользователь мог узнать, как организованы его данные. [30]
WinFS включает Правила , [22] которые выполняются при выполнении определенного условия. Правила WinFS работают с данными и отношениями между данными. Например, можно создать правило, которое гласит, что всякий раз, когда создается Элемент, содержащий поле «Имя» , и если значение этого поля — определенное имя, должна быть создана связь, связывающая Элемент с другим Элементом. Правила WinFS также могут обращаться к любому внешнему приложению. Например, можно создать правило, которое запускает приложение Notify всякий раз, когда от определенного контакта приходит письмо. [22] Правила WinFS также можно использовать для добавления новых полей свойств к существующим Элементам данных. [22]
Правила WinFS также представлены как объекты .NET CLR. Таким образом, любое правило может быть использовано для любых целей. Правило может быть даже расширено путем наследования от него для формирования нового правила, которое состоит из условия и действия родительского правила плюс что-то еще. [22]
WinFS поддерживает создание Rich Application Views (RAV) путем агрегации различных данных в формате виртуальной таблицы. В отличие от представления базы данных , где каждый отдельный элемент может быть только скалярным значением, RAV могут иметь сложные элементы или даже коллекции элементов. Фактические данные могут быть представлены в нескольких типах данных или экземплярах и даже могут быть извлечены путем обхода отношений. [10] RAV по своей сути являются страничными (разделяя весь набор данных на более мелкие страницы , содержащие разрозненные подмножества данных) средой выполнения WinFS. Размер страницы определяется во время создания представления, а API WinFS предоставляет методы для итерации по страницам. RAV также поддерживает изменение представления в соответствии с различными параметрами группировки. Представления также могут быть запрошены.
Несмотря на то, что все данные являются общими, не все одинаково доступно. WinFS использует систему аутентификации Windows для предоставления двух механизмов защиты данных. [30] Во-первых, есть безопасность на уровне общего ресурса, которая контролирует доступ к вашему общему ресурсу WinFS. Во-вторых, есть безопасность на уровне элемента, которая поддерживает совместимые с NT дескрипторы безопасности. Процесс, получающий доступ к элементу, должен иметь достаточно привилегий для доступа к нему. Также в Vista есть концепция «уровня целостности» для приложения. К данным с более высокой целостностью не может получить доступ процесс с более низкой целостностью.
Основной режим извлечения данных из хранилища WinFS — это запрос хранилища WinFS в соответствии с некоторыми критериями, [8] который возвращает перечислимый набор элементов, соответствующих критериям. Критерии для запроса указываются с помощью языка запросов OPath . Возвращаемые данные предоставляются в виде экземпляров схем типов, соответствующих объектной модели .NET . [32] Доступ к данным в них можно получить, обратившись к свойствам отдельных объектов. [31]
Отношения также представлены как свойства. Каждый элемент WinFS имеет два свойства, называемые IncomingRelationships и OutgoingRelationships , которые предоставляют доступ к набору экземпляров отношений, в которых участвует элемент. Другой элемент, который участвует в одном экземпляре отношений, может быть достигнут через соответствующий экземпляр отношений. [10] [31]
Тот факт, что к данным можно получить доступ с помощью их описания, а не местоположения, может быть использован для предоставления организационных возможностей конечного пользователя, не ограничиваясь иерархической организацией, используемой в файловых системах. В файловой системе каждый файл или папка содержится только в одной папке. Но элементы WinFS могут участвовать в любом количестве отношений хранения, в том числе с любыми другими элементами. Таким образом, конечные пользователи не ограничены только организацией файлов/папок. Вместо этого контакт может стать контейнером для документов; изображение — контейнером для контактов и т. д. Для совместимости с устаревшими версиями WinFS включает псевдотип, называемый Folder, который присутствует только для участия в отношениях хранения и эмуляции организации файлов/папок. Поскольку любой элемент WinFS может быть связан с более чем одним элементом Folder, с точки зрения конечного пользователя элемент может находиться в нескольких папках без дублирования фактических данных. [10] Приложения также могут анализировать графики отношений для представления различных фильтров. Например, приложение электронной почты может анализировать связанные контакты и связи контактов со счетами в ресторане и динамически генерировать фильтры, такие как «Письма, отправленные людям, с которыми я обедал» .
WinFS API предоставляет класс, называемый классом ItemContext , который привязан к хранилищу WinFS. Объект ItemContext может использоваться для охвата поиска всем хранилищем или его подмножеством. Он также обеспечивает транзакционный доступ к хранилищу. [15] Затем объект этого класса может породить объект ItemSearcher , который затем принимает тип (объект, представляющий тип) элемента, который нужно извлечь, или связь и строку запроса OPath , представляющую критерии поиска. [31] [33] Возвращается набор всех совпадений, который затем может быть привязан к виджету пользовательского интерфейса для массового отображения или перечисления по отдельности. [30] Элементы свойств также могут быть изменены, а затем сохранены обратно в хранилище данных для обновления данных. Объект ItemContext закрывается ( что отмечает конец ассоциации объекта с хранилищем), когда выполняются запросы или изменения объединяются в хранилище.
Связанные элементы также могут быть доступны через элементы. Свойства IncomingRelationships и OutgoingRelationships предоставляют доступ ко всем наборам экземпляров отношений, типизированных по имени отношения. Эти объекты отношений предоставляют другой элемент через свойство. Так, например, если изображение связано с изображением, к нему можно получить доступ, пройдя по отношению как:
ContactsCollection contacts = picture.OutgoingRelationships.Cast ( typeof ( Contact )). Value ; // Это извлекает коллекцию всех исходящих отношений из объекта picture , // фильтрует доступные из них контакты и извлекает их значение. // Или связь может быть статически указана как ContactsCollection contacts = picture . OutgoingRelationships . OutContactRelationship . Contact ;
Строка запроса OPath позволяет выразить параметры, которые будут запрошены, чтобы быть указанными с использованием свойств элемента , встроенных элементов , а также отношений . [ требуется ссылка ] Она может указывать одно условие поиска, например "title = Something'" или составное условие, например "title = 'Title 1' || title = 'Title 2' && author = 'Someone'" . Эти логические и реляционные операции могут быть указаны с помощью операторов C#, таких как && , || , = , !=, а также их эквивалентов в английском языке, таких как EQUAL , NOT EQUAL . Также поддерживаются операторы SQL , такие как LIKE , GROUP BY и ORDER BY , как и подстановочные условия. [ требуется ссылка ] Таким образом, "title LIKE 'any*'" является допустимой строкой запроса. Эти операторы могут использоваться для выполнения сложных поисков, таких как
using ( ItemContext ic = ItemContext . Open ()) { // Поиск начинается с создания объекта ItemSearcher. Поисковик создается из // экземпляра отношения, поскольку искомые контакты находятся в отношении. // Первый параметр определяет область поиска. ItemContext в качестве области означает, что поиск будет производиться во всем хранилище. Область может быть ограничена набором элементов, которые могут // находиться в удерживающей связи с контактами. В этом случае набор передается как // область поиска. ItemSearcher searcher = OutContactRelationship . GetTargetSearcher ( ic , typeof ( Contact )); ContactCollection contacts = searcher . FindAll ( "OutContactRelationship.Contact.Name LIKE 'A*'" ); }
Приведенный выше фрагмент кода создает объект ItemSearcher, который выполняет поиск в экземпляре OutContactRelationship , связывающем изображения и контакты, по сути, выполняя поиск по всем изображениям, связанным с контактом. Затем он выполняет запрос Name LIKE 'A*'" для всех контактов, доступных через OutContactRelationship , возвращая список "контактов, чьи имена начинаются с A и чьи фотографии у меня есть" . Аналогичным образом, можно учесть больше связей, чтобы еще больше сузить результаты. [10] [31] Кроме того, процессор запросов на естественном языке, который анализирует запрос на естественном языке и создает правильно сформированную строку запроса OPath для поиска с помощью соответствующих связей, может позволить пользователям выполнять поиск, например "найти название вина, которое я пил с человеком X в прошлом месяце" , при условии, что приложения для управления финансами используют WinFS для хранения счетов.
Различные отношения определяют различные наборы данных. Поэтому, когда выполняется поиск, охватывающий несколько отношений, различные наборы данных извлекаются по отдельности, и вычисляется объединение различных наборов. Результирующий набор содержит только те элементы данных, которые соответствуют всем отношениям. [31]
WinFS включает лучшую поддержку для обработки часто меняющихся данных. Используя WinFS Notifications , приложения выбирают уведомления об изменениях в выбранных элементах данных . WinFS вызовет ItemChangedEvent , используя модель .NET Event, когда изменяется подписанный элемент, и событие будет опубликовано в приложениях. [31]
WinFS включает функцию Information Agent для управления, поиска и хранения правил уведомления конечного пользователя и предпочтений для изменений элементов в хранилище данных. Используя Information Agent, можно автоматически определять связи с новыми элементами на основе событий, таких как встречи, например, встречи могут быть связаны с фотографиями на основе дат, когда фотографии были сделаны, что позволяет выполнять запросы по дням рождения или праздникам без необходимости знать фактические даты таких событий (« найти все фотографии, сделанные в этот день рождения »). Другие примеры включают автоматическое перемещение новых элементов в определенные папки на основе правила, определяемого временем встречи и датами, когда были сделаны фотографии (« когда я импортирую фотографию, сделанную во время делового мероприятия, перемещаю ее в папку «Деловые мероприятия ») или более сложные возможности. Information Agent также может пересылать уведомления на другие устройства (« если я получаю высокоприоритетное электронное письмо от своего начальника, отправляю уведомление на мой телефон ») и аналогичен функциональности правил и оповещений Microsoft Outlook.
WinFS позволяет легко обмениваться данными между приложениями и между несколькими хранилищами WinFS, которые могут находиться на разных компьютерах, путем копирования в них и из них. [34] Элемент WinFS также может быть скопирован в файловую систему, отличную от WinFS, но если этот элемент данных не будет возвращен в хранилище WinFS, он не будет поддерживать расширенные службы, предоставляемые WinFS.
WinFS API также предоставляет некоторую поддержку для совместного использования с не-WinFS приложениями. WinFS предоставляет объект оболочки для доступа к хранилищам WinFS. Этот объект сопоставляет элементы WinFS с иерархией виртуальных папок и может быть доступен любому приложению. [12] Виртуальные папки могут автоматически обмениваться новым содержимым, на которое ссылается запрос, с пользователями (виртуальная папка для « всех фотографий из отпуска » может автоматически обмениваться новыми элементами, возвращаемыми этим запросом, с пользователями). Данные WinFS также могут быть вручную предоставлены совместно с использованием сетевых ресурсов , путем совместного использования устаревшего объекта оболочки. [34] Форматы файлов не-WinFS могут храниться в хранилищах WinFS, используя элемент файла, предоставляемый WinFS. Можно написать импортеры для преобразования определенных форматов файлов в типы элементов WinFS. [34]
Кроме того, WinFS предоставляет службы для автоматической синхронизации элементов в двух или более хранилищах WinFS при соблюдении некоторых предопределенных условий, таких как « обмен только фотографиями » или « обмен фотографиями, имеющими связанный контакт X ». [34] Хранилища могут находиться на разных компьютерах. Синхронизация выполняется в одноранговой манере; нет центрального органа. Синхронизация может быть ручной, автоматической или запланированной. Во время синхронизации WinFS находит новые и измененные элементы и обновляет их соответствующим образом. Если два или более изменений конфликтуют, WinFS может либо прибегнуть к автоматическому разрешению на основе предопределенных правил, либо отложить синхронизацию для ручного разрешения. WinFS также обновляет схемы, если это необходимо. [34]
WinFS Beta 1 включает расширение пространства имен оболочки , которое отображает хранилища WinFS как объекты верхнего уровня в представлении «Мой компьютер» . [12] Файлы можно копировать в хранилища и из них, а также можно напрямую использовать приложения для сохранения в них. Даже такие папки, как «Мои документы», можно перенаправлять в хранилища. [12] WinFS использует подключаемые модули Importer для анализа файлов при их импорте в хранилище и создания надлежащих схем и объектов WinFS, а при извлечении объектов — для повторной упаковки их в файлы. [34] Если импортеры для определенных файлов не установлены, они сохраняются как общие типы файлов .
Microsoft Rave — это приложение, которое поставляется с WinFS Beta 1. Оно позволяет синхронизировать два или более хранилищ WinFS и поддерживает синхронизацию в режиме полной сетки , а также топологию центрального концентратора . Во время синхронизации Microsoft Rave определит изменения, внесенные в каждое хранилище с момента последней синхронизации, и выполнит соответствующее обновление. При применении изменений он также определяет, есть ли конфликт, т. е. были ли изменены одни и те же данные в обоих хранилищах с момента последней синхронизации. Он либо запишет конфликтующие данные для последующего разрешения, либо немедленно их разрешит. Microsoft Rave использует одноранговую технологию для связи и передачи данных.
В WinFS Beta 1 Microsoft включила неподдерживаемое приложение StoreSpy [35] , которое позволяло просматривать хранилища WinFS, представляя иерархическое представление элементов WinFS. Оно автоматически генерировало виртуальные папки на основе разрешений доступа, даты и других метаданных и представляло их в виде иерархического дерева, похожего на то, в котором представлены традиционные папки. Приложение генерировало вкладки для различных типов элементов. StoreSpy позволяло просматривать элементы , отношения , MultiSet , вложенные элементы , расширения [36] и другие типы в хранилище вместе с его полными метаданными. Оно также представляло интерфейс поиска для выполнения ручного поиска и сохранения их в виде виртуальных папок. Приложение также представляло графическое представление правил WinFS. Однако оно не позволяло редактировать элементы или их свойства, хотя это было запланировано для включения в будущий выпуск. [37] Но проект WinFS был сокращен до того, как он смог материализоваться.
WinFS также включает в себя другое приложение, называемое WinFS Type Browser , которое может использоваться для просмотра типов WinFS, а также для визуализации иерархических отношений между типами WinFS. [38] Тип WinFS, как встроенные типы, так и пользовательские схемы, могут быть визуализированы вместе со всеми свойствами и методами, которые он поддерживает. Он также показывает типы, от которых он происходит, а также другие типы, которые расширяют схему типов. Однако, хотя он был включен в WinFS, он был выпущен как неподдерживаемый инструмент. [38]
WinFS Beta 1 также включает неподдерживаемое приложение, называемое OPather . [39] Оно представляет собой графический интерфейс для написания запросов Opath. Его можно использовать, выбрав тип целевого объекта и указав параметры запроса. Оно также включает функцию завершения параметров, подобную Intellisense . Затем его можно использовать для выполнения задач визуализации, таких как привязка результатов запроса к элементу управления DataGrid , создание представлений данных в самой WinFS или просто извлечение строки запроса.
Microsoft запустила проект по созданию приложения визуализации данных для WinFS. Он имел кодовое название «Project Orange» и предположительно был создан с использованием Windows Presentation Foundation . [40] Он должен был обеспечить исследование элементов , хранящихся в хранилищах WinFS, а связи между данными должны были стать важной частью модели навигации. Он должен был позволить людям также графически организовывать хранилища WinFS — продуктизируя многие концепции, показанные в файле IWish Concept Video WMV. Однако, поскольку проект WinFS заглох, статус этого проекта неизвестен.