Я хотел бы видеть некоторые примеры простых баз данных на основе плоских файлов и как к ним получают доступ через слой данных. Я записал в и читал из плоского файла прежде, но я никогда не создавал слой данных, который получил доступ к данным для приложения с помощью текстовых файлов.
Если возможно, было бы хорошо видеть учебное руководство, которое имело слой данных, который использовал простую, пользовательскую базу данных на основе плоских файлов. Пример, который сохраняет пользовательские бизнес-объекты в XML и затем загружает их, был бы хорош, потому что XML так популярен и легок работать с.
Я также был бы благодарен за любые ссылки на сайты, которые обсуждают лучшие практики относительно дизайна баз данных на основе плоских файлов и т.д.
Моя цель состоит в том, чтобы иметь решение для того, чтобы хранить простые данные на машине пользователя и иметь их не, нуждаются в любом специальном установленном программном обеспечении (как SQL Server, и т.д.) для выборки данных из того, где это хранится.
Я знаю, что это - очень общий вопрос, но любой совет, который может указать на меня в правильном направлении, приветствуется.
] Возможно, вы немного перепутали свои определения, понятные в связи с большим количеством подобных технологий, существующих сегодня. [
] []XML - это не []плоский формат файла [] (или плоская файловая база данных), но из прочтения вашей цели это звучит так, как будто вы на самом деле хотите, чтобы это была реляционная база данных, а не фактический плоский файл. [
] []Как и другие, я могу настоятельно рекомендовать SQLite для этой цели. Существуют привязки для различных платформ, .NET имеет []System.Data.SQLite[], который в одном файле является и провайдером, и движком базы данных. [
] []Большим преимуществом использования SQLite является то, что реальная база данных полностью содержится в одном файле, контролируемом вашим приложением, и что она поддерживает стандартные команды SQL DDL и DML (т.е. SELECT, INSERT, UPDATE, DELETE, CREATE DATABASE/TABLE и т.д.).[
] []Для одного пользовательского приложения SQLite является отличным (одним из лучших) способом хранения как данных приложения, так и его настроек. В последнее время []был диск[], что он может поддерживать даже маломасштабные многопользовательские приложения. [
] []Однако, Oracle, MySQL, SQL Server и т.д. определенно предпочтительны для многопользовательских приложений (даже для небольших приложений), если у вас есть возможность доступа/использования сервера баз данных.[
] []Также не забывайте, что выбор базы данных не является взаимоисключающим. [
] []У вас может быть многопользовательское приложение с богатым пользовательским интерфейсом, установленным на компьютерах многих пользователей. Центральная база данных здесь действительно должна быть многопользовательской db, такой как MySQL. Но в рамках богатого клиентского интерфейса SQLIte идеально подходит для хранения настроек каждого пользователя, или, возможно, для обеспечения поддержки в автономном режиме, когда база данных не может быть доступна.[
].]Текстовые форматы, такие как []CSV[], []INI[], []XML[], могут использоваться для хранения структурированных данных, однако IMO не являются гибкими или эффективными для использования в качестве баз данных.[
] []Я рекомендую []SQLite[] в качестве отличной альтернативы. Это очень мощный, легкий и автономный движок баз данных. [
]]Вы можете взять свой торт и съесть его тоже:[
] [][]SQLite[] - это база данных SQL, которая состоит из одного файла и не требует установки, она имеет привязки для многих языков и работает на разных платформах.[
] []Нет необходимости в том случае, если Вы упомянули, писать свой собственный слой данных поверх плоских файлов. На самом деле, если вам не нужны учебные упражнения, я бы не советовал это делать.[
].] Доступно несколько встроенных баз данных, о которых вашему пользователю не придется беспокоиться вообще.[
] []SQLLite - распространенная, популярная, кроссплатформенная и т.д. Зависит от языка реализации. Если вы используете Java, то их несколько, например, Derby. .NET - это не мой ballywick, но я думаю, что там что-то есть. Как минимум, у MS есть свободно используемый рабочий стол, встроенный SQL движок, который вы можете использовать.[
] []Написание собственного может быть интересным упражнением, но это колесо уже сделано, и просто проще и эффективнее использовать существующую базу данных, чем начинать с нуля. Это никак не повлияет на ваших пользователей, так что если это основной драйвер, то нет причин не использовать доступный продукт/проект[
].] В Perl есть модуль []DBD::CSV[], который может загружать csv-файлы и опрашивать их с помощью SQL-запросов. Но для Вашей цели я думаю, что Вам лучше исследовать []SQLite[], которая является правильной реляционной базой данных, работающей без сервера.[
].] Вместо того, чтобы изобретать базы данных заново, почему бы не связать ваше приложение с простым движком баз данных? Базы данных бывают разных размеров, не все они огромные :-)[
] []Если вы хотите заново изобрести колесо, то, глядя на исходный код простых открытых движков баз данных, следует указать вам правильное направление.[
]. Ваш обработчик событий DoWork
shoud периодически проверяют BackgroundWorker. CancellationPending
и набор DoWorkEventArgs. Отменить
к истинному прежде, чем возвратиться, если это было отменено.
Обработчик событий RunWorureCompleted
должен проверить свойство RunWoreyCompletedEventArgs.Canceled
, чтобы определить, отменен ли обработчик событий DoWork
(установите значение DoWorkEventArgs.Cancel
).
В случае условия гонки может случиться так, что пользователь запросил отмену ( BackgroundWorker.Depending
имеет значение true), но работник ее не увидел ( RunWoreyCompletedEventArgs.Canceled
имеет значение false). Вы можете проверить эти два свойства, чтобы определить, что это произошло, и сделать все, что вы выбрали (либо рассматривать это как успешное завершение - потому что работник действительно закончил успешно, или как отмену - потому что пользователь отменил и больше не волнует).
Я не вижу никакой ситуации, когда есть какая-либо неясность в том, что произошло.
EDIT
В ответ на комментарий - если существует несколько классов, которые должны обнаружить Pending
, нет никакой альтернативы передаче этим классам ссылки на тип, такой как BackgroundWorker
, который позволяет им получить эту информацию. Вы можете абстрагировать это в интерфейс, что я обычно делаю, как описано в этом ответе на вопрос о BackgroundWorkers.Однако необходимо передать ссылку на тип, реализующий этот интерфейс, рабочим классам.
Если необходимо, чтобы рабочие классы могли задавать DoWorkEventArgs.Cancel
, необходимо либо передать ссылку на это, либо принять другое соглашение (например, логическое возвращаемое значение или пользовательское исключение), которое позволяет рабочим классам указывать, что произошла отмена.
Я согласен с многочисленными комментариями, предполагающими, что лучше использовать существующее ядро базы данных. Однако в качестве попытки фактически ответить на вопрос: