I'm looking at a new line of business application requirements (technical, not accounting). The application needs the following architecture:
- Backend database that is available to users worldwide with decent response time. Can use replication of the database if necessary to ensure low latency performance. Client organization prefers to host this themselves rather than use a SaaS or Cloud because of data security / contractual issues regarding data ownership. Data is not particularly relational, and is more of an object tree. There may be unique objects in the datastore with attributes that exist ONCE in the database. However, need to store an audit trail (not necessarily rollback) of all data changes, who made them, and when, and allow for different versions of data where users might be looking at a mixture of datasets. A real-world description of this would be a master drawing with various transparencies over it with changes. When users are finished with changes they could publish back to the master and this would then be seen by others. Looking at various database options (SQL via ORM, NoSQL). No strict backend restrictions on platform
- Middle tier for business logic, including authentication and authorization of users. Auth must be Active Directory compatible for Client systems. Business logic is relatively straightforward, passing data from database to users and back. No restrictions on platform or language - but ideally would like something that is scriptable so business logic can be added without needing to recompile. Also need good performance when being hit by hundreds of concurrent users.
- Client tier would be primarily Windows Desktop based, with both graphical (drawings) and data entry/manipulation. COM layer / interfacing with MS Excel is business critical, so I'm thinking this should be a .NET application.
- Secondary Client tier would eventually be mobile / web interface. Would not have the full functionality of the Windows Desktop application (no drawing interface), but would have functionality to review / comment / approved data and publish data to "Master Layer" in the database.
I am NOT a full time programmer. But I have done some programming over the last 25 years in FORTRAN, Common Lisp, Pascal, VB and Python. I might be described as the idea guy here - not the implementer.
If we wanted to prototype this, what would be the best platform to do it in? I'm thinking because of the Client end that .NET would be good, but I'm concerned about the ability to use .NET for the backend if we use something other than SQL (I know nothing about LINQ - could that help me?). Also, I really like the idea of dynamically typed languages because of their expressiveness and speed of development.
Considering low latency and non-relational kind of data NoSQL would be right choice. Many of popular databases have good support for .net (like MongoDB, CouchBase), even for its lambdas/expressions and LINQ. Also you have to take into account eventual consistency, (whatever way you go relational or NoSQL, replication or sharding) that may affect the backend architecture.
Regarding audit trail, versioning and publishing changes look at CQRS and Event Sourcing architectural patterns, they solve such problems very well.
For client apps I'd suggest to try Xamarin. (it's better than WPF, I think, because it's not focused on particular devices as much as WPF is) This gives the main benefit of using the same dev platform/language for both server and client apps and lower development/support costs.
Regarding Desktop app, I'm not sure if Xamarin supports COM but if not you can share client code and decouple presentation layer. So you'll have separate layers for Desktop (Visual Studio) and Mobile (Xamarin)
All of this stuff can be made using .net and I see here a great pro: using common code base for all your apps.