• JesseBizInt (12/12/2016)


    In my environment I have many different departments that need to be kept separate from each other, yet share some data elements such as calendars and employee profiles. I work for a tribal government, which means I have to deal with various regulations re: data confidentiality and access. I implement just one data warehouse (SQL Server database) to store all the data, and then I use other databases that just hold views to expose the data to various end user applications. For example, let's say the accounting department and the health clinic both need access to employee data and to the calendar, but each have their own fact tables.

    In the data warehouse, you would see:

    Core_Dim_Employee

    Core_Dim_Date

    Accounting_Fact_GrantHours

    Health_Fact_PatientEncounters

    There would also be two separate databases: HealthDM and AccountingDM (DM standing for data mart)

    HealthDM would have these views:

    Core_Dim_Employee (WHERE Division='Health' to only include Health division employees)

    Core_Dim_Date

    Health_Fact_PatientEncounters

    AccountingDM would have these views:

    Core_Dim_Employee

    Core_Dim_Date

    Accounting_Fact_GrantHours

    For me, this allows me that single source of truth and place to enforce data standards, and for the end user, they can only see the data that they need to see and that interests them. They can point Excel or whatever other tool they want to use at their DM and get the data they need without seeing the other departments' data. If a end user needs a cube built, then I use the appropriate DM for the data source that feeds the cube. Because the DMs only hold views, the data is always matching the data in teh data warehouse.

    You mention a separate database to hold your views yet you are referencing the accountingDM database as a location for views as well. To me when you need to create a join across databases you have to decide where you need to store that view if they are not all on a dedicated database. Here you could run into the situation where you would need to store two versions of the same view across two databases due to security restrictions if you wanted more than one user to access that view (if they each only had access to one of the respective databases in the view but both needed access to the information in the view).

    I would take a look at schemas within a database, just my preference.

    ----------------------------------------------------