Это действительно зависит от ваших потребностей. Использование XML для DAL имеет смысл только для небольшого проекта, и даже в этом случае SQLite может быть лучшим решением. Единственное «преимущество» в XML заключается в том, что он представляет собой текстовый формат, удобочитаемый для человека, но в этом смысле он лучше служит экспортным файлом, чем действительной технологией DAL. Проблема с любой «сделанной вручную» единой файловой системой БД заключается в том, что вам нужно сохранять весь файл каждый раз, когда вы вносите изменения (если вы не выберете отображенных в память файлов , что может быть излишним в зависимости от ваших потребностей).
Для каждой операции вставки или обновления вам понадобятся программа чтения и записи, чтобы скопировать все записи в новый файл. В зависимости от размера файла, один из вариантов может заключаться в том, чтобы хранить записи в памяти в течение срока службы приложения и время от времени сбрасывать их на диск. Это был бы статически доступный список (с учетом параллелизма), но он имеет смысл только в том случае, если база данных относительно мала.
Ваша самая большая проблема может быть последовательность и целостность транзакций. Если у вас два процесса, использующих один и тот же XML-файл одновременно, синхронизировать доступ будет сложно. Кроме того, сбой приложения или сбой питания могут привести к повреждению данных, а это значит, что вам следует подумать о какой-то системе журналирования. Например, SQLite, на первый взгляд простой, выглядит как ACID и прилагает немало усилий для достижения этой цели (если у вас есть время, проверьте эту длинную статью чтобы получить представление). Реализация этого с нуля - это настоящее излишество.
Итак, подведем итог, ваши варианты:
У вас есть только один процесс, использующий один файл.
а. База данных небольшая: храните ее в памяти, блокируйте все операции и регулярно очищайте. Относительно просто.
б. База данных большая:
использовать комбинацию чтения / записи для копирования всего файла в каждой операции. Очень просто, но медленнее.
хранить очереди команд и сбрасывать их партиями. Быстрее, добавляет некоторую поддержку транзакций, но сложно.
Другой процесс может получить доступ к файлу.
а. реализовать механизм ведения журнала для предотвращения одновременного доступа.
б. создайте отдельный сервис, который будет обрабатывать все транзакции сам.
В любом случае вам может потребоваться сохранить файл журнала транзакций и использовать его для обеспечения согласованности данных между обращениями. Ваше приложение должно быть в состоянии самостоятельно восстанавливаться после сбоев. Мое мнение таково, что SQLite - это, вероятно, правильный путь: в сочетании с решением ORM, таким как NHibernate, он действительно прост и безопасен в использовании.