Search code examples
c#databasedata-storage

Is a database the right choice for data storage for my C# application?


I am developing a C# application and want to be sure I choose the best choice for data storage that fits these specs.

The program can have a infinite amount of data, but that data will only be used by a single user that is using the application. Each time the application is closed, I need to save the data, and it needs to be loaded in when the application is started.

I have looked at databases, but am unsure as to which would be best suited for my needs. Also, I wonder if I need a database at all given the above specs, maybe I should just use a binary file/XML file implementing serialization and deserialization.

Point me in the right direction please!

Thanks, OC

EDIT: One important factor I forgot to include is the necessity to allow one user to save all the entries he/she entered and export it to an external file that can be easily shared between applications/users.


Solution

  • Without knowing more about what your specific application does, it's hard (for us) to say whether a database is the right choice. However, there are some rules of thumb that you can use to help steer your decision.

    A database may be a good choice when:

    • The data may be used by multiple users.
    • When concurrent activity is possible that must be correctly stored.
    • When the data collected does not all need to be loaded into memory at once.
    • When you wish to be able to query or report on data in complex ways.
    • When you want to have transparency into the data being stored using standard tools.
    • When changes are mostly localized rather than requiring the entire datastore to be rebuilt.
    • When your data lends itself to a relational (rather than say a hierarchical representation).

    A database may not be the best choice when:

    • You only service a single user.
    • There is little concurrent activity, and the entire data model must be recreated when saving changes.
    • When there will be very little data, and it will be loaded into memory all at once.
    • When you data is hierarchical or difficult to model relationally.
    • When your application is document-oriented, and documents (files) will be sent to other users.
    • When there is a significant amount of binary data interspersed in the data your storing.
    • When you want to avoid dependencies to third party tools or services.
    • When the structure of your data model is likely to change frequently.

    These are all rules of thumb ... no single condition is going to dictate whether to use a database or not. You must examine all of the considerations, and decide whether using a database will give you sufficient benefit - or not.

    In many environments, (such as iPhone, for example) there is a built-in database layer available directly on the platform. There are also tools (like NSCoreData) which help you overcome the Object-Relational Modeling (ORM) impedence mismatch. In such cases, it may make a lot of sense to use a database ever for very simple data storage.

    There are also a number of open source data persistence layers (NHiberante, DB4O, and others) that help simplify using a database as a persistence store ... which, if you can use them, can shift the equation in favor of using a database.

    A database can substantially simplify the development of your application when you need to support queries or search functionality. Relational databases support a query language (SQL), which moves the effort of identifying and retrieving results from the database much easier. Letting the database do the heavy lifting can be a significant time saver - as databases are specifically designed to perform query operations correctly and efficiently. However, this comes at the cost of a well-designed relational data structure - which you must create.

    One significant consideration, is whether users will share the data that they create/consume using your application. If your application is more document oriented (think Word, Excel, Powerpoint), then a file-based serialization model may be more appropriate. If your application's data will not be shared - then a database may make sense.

    Another significant factor is how open you want your data to be. Databases store information in well-defined structures (tables), and this makes it easier for you (and your users) to directly access and inspect the data. Storage formats like XML, also allow this, but to a somewhat lesser extent.