So - this is a classic SO debate and a debate amongst passionate programmers. I've asked a similar but more generic question about it...
business logic in database layer
To answer the first part, I found one of the best explanations I have seen about business logic in code vs database is here:
http://www.codeproject.com/KB/architecture/DudeWheresMyBusinessLogic.aspx
It goes on to explain why business logic is much better and scaleable. I'm on that mindset as well... so to answer your question, I would keep no business logic in the DB or stored procs, for the main reason amongst many others being that SPs aren't version controlled, and its a pain to version control them. Not to mention, IDEs for SPs are infinitely more primitive than IDEs for code. And sql/tsql and things like that were not meant for complex code structure, but basic manipulation of data, and as you'll see in the article, for some very basic code stucture because previously client-server architecture was limited.
Some excepts from this page:
In a client server system there are two tiers thus forcing at least two layers to be implemented. In the early days the server was simply viewed as a remote database and the division was seen as application (client) and storage (server). Typically all the business logic remained in the client, intermixed with other layers such as the user interface.
It did not take very long to realize that the network bandwidth could be reduced and logic centralized to reduce constant redeployment needs of the client by moving much of the business logic out of the client. As there were only two layers, the only place to move the business logic to was the server. The server architecturally was a well suited place in a client server system, but the database as a platform was a poor choice. Databases were designed for storage and retrieval and their extensibility was designed around such needs. Database stored procedure languages were designed for basic data transformation to supplement what could not be done in SQL. Stored procedure languages were designed to execute very quickly and not for complex business logic.
But it was the better of the two choices so business logic was moved into stored procedures. In fact I would argue that business logic was shoe horned (smashed in, made to fit) into stored procedures as a matter of pragmatism. In a two tier world, it was not perfect but was an improvement.
The business layer should contain all of the business rules.
Such a design has the following advantages:
- All the business logic exists in a single location and can be easily verified, debugged, and modified.
- A true development language can be used to implement business rules. Such a language is both more flexible and more suited to such business rules rather than the SQL and stored procedures.
- The database becomes a storage layer and can focus on efficiently retrieving and storing data without any constraints related to business logic implementations or the presentation layer.
So - now, in regards to the architecture, I would do it so that each users badges would get updated via calling a stored proc when the related question/answer or anything else gets updated. You put this in the business logic of the question or answer, as I assume that it will be different for different types of items (when they get modified). Because this is a event based action, the action would only happen when the event happens. If you have a service or scheduled tasks, it will run all the time, and though minimal, it will bog down the system eventually when you have a lot of users.
If you don't want to have each users' events to trigger a gazilion checks and updates, you can batch them into a table, and have a scheduled job to update the badges.
To allow for the system to update an entire userbase based on new business logic, you can encompass all your actions into a windows job, or a one time job, and that would function better than tsql, IMHO, and would be much more maintable, and flexible.
However, sometimes it may benefit you to duplicate VERY little of the business logic, for some performance gain. But as you see in the article, business layer in code is much more scaleable, so it may be a moot point.
Hopefully this is useful information for you, to decide on what you need...