Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 6 Next »

 

Note that the DSP Group of a user is derived from this data via business logic that exists outside of the data model. The pseudocode is as follows:

if User->Fasit
  "CTS DSP Team FASIT"
else
  User->Org->Contract->DSPGroup.Name

 

This part of the data model is newly normalized in the wake of a previous scheme, which copied the DSP Group to the User record as an attribute. Currently we import user and org data from canonical sources, and we try not to extend the user object (or other imported objects) just to implement business logic.

Business logic can usually be implemented in business rules, UI Actions, script includes, scheduled jobs, and other code. This can make end user reporting and data mining more difficult, but building reporting structure on top of the existing database is not a good idea, mostly because it: 

  • wastes space
  • encourages denormalization
  • introduces complexity and potential confusion

Imagine 3 fields in different tables all representing the same object type but with slightly different semantics. Which one do I use? Are they in sync? We already warehouse data with third parties for reporting purposes, and we discourage attempts to denormalize data (especially in transactional tables) purely for reporting or integration purposes. 

Here is example SNow JS for obtaining the correct DSP Group for a given user in the absence of a denormalized field or store proc:

// if user is FASIT, use FASIT group, else use the org's group
// gr = user's GlideRecord 
if(gr.u_facit == true) {
    gs.addInfoMessage('Assigned to FASIT DSP Group');
    current.assignment_group = sys_user_group_by_name('CTS DSP Team FASIT');
} else {
    current.assignment_group = gr.u_organization.u_service_contract.u_assignment_group.sys_id;
}

 

 

  • No labels