In SQL Server 2005 Microsoft introduced user-schema separation and since then I have seen the use of schemas increase; whereas before I would typically see databases where all objects were in the [dbo] schema I now see databases that have multiple schemas, a database I saw recently had 31 (thirty one) of them.
I can’t help but wonder whether this is a good thing or not – clearly 31 is an extreme case but I question whether multiple schemas create more problems than they solve? I have been involved in many discussions that go something like this:
Developer #1> “I have a new function to add to the database and I’m not sure which schema to put it in”
Developer #2> “What does it do?”
Developer #1> “It provides data to a report in Reporting Services”
Developer #2> “Ok, so put it in the [reports] schema”
Developer #1> “Well I could, but the data will only be used by our Financial reporting folks so shouldn’t I put it in the [financial] schema?”
Developer #2> “Maybe, yes”
Developer #1> “Mind you, the data is supposed to be used for regulatory reporting to the FSA, should I put it in [regulatory]?”
Developer #2> “Err….”
You get the idea!!! The more schemas that exist in your database then the more chance that their supposed usages will overlap.
I’m left wondering whether the use of schemas is actually necessary. I don’t really see them as an aid to security because I generally believe that principles should be assigned permissions on objects as-needed on a case-by-case basis (and I have a stock SQL query that deciphers them all for me) so why bother using them at all? I can envisage a use where a database is used to house objects pertaining to many different business functions (which, in itself, is an ambiguous term) and in that circumstance perhaps a schema per business function would be appropriate; hence of late I have been loosely following this edict:
If some objects in a database could be moved en masse to another database without the need to remove any foreign key constraints then those objects could legitimately exist in a dedicated schema.
I am interested to know what other people’s thoughts are on this. If you would like to share then please do so in the comments.