{"id":2529,"date":"2022-03-28T14:48:11","date_gmt":"2022-03-28T19:48:11","guid":{"rendered":"https:\/\/rpchurchill.com\/wordpress\/?p=2529"},"modified":"2023-10-06T17:07:01","modified_gmt":"2023-10-06T22:07:01","slug":"data-modeling","status":"publish","type":"post","link":"https:\/\/rpchurchill.com\/wordpress\/posts\/2022\/03\/28\/data-modeling\/","title":{"rendered":"Data Modeling"},"content":{"rendered":"<p>From the BABOK:<\/p>\n<blockquote><p>A data model describes the entities, classes or data objects relevant to a domain, the attributes that are used to describe them, and the relationships among them to provide a common set of semantics for analysis and implementation.<\/p><\/blockquote>\n<p>I&#8217;ve written about data <a href=\"https:\/\/rpchurchill.com\/wordpress\/posts\/2022\/03\/14\/data-dictionary\/\">in<\/a> <a href=\"https:\/\/rpchurchill.com\/wordpress\/posts\/2019\/04\/03\/using-data-in-my-framework-and-in-simulations\/\">many<\/a> <a href=\"https:\/\/rpchurchill.com\/wordpress\/posts\/2021\/04\/02\/ba-webinar-series-08-data-how-to-get-it-and-how-to-use-it\/\">contexts<\/a>, but I usually start by pointing out that data is identified through the processes of <a href=\"https:\/\/rpchurchill.com\/wordpress\/posts\/2018\/04\/25\/discovery-learning-whats-in-a-process\/\">discovery<\/a>, which identifies the nouns and verbs of a process (the BABOK refers to these as <strong>entities<\/strong>), and <a href=\"https:\/\/rpchurchill.com\/wordpress\/posts\/2018\/04\/26\/data-collection-characterizing-a-process\/\">data collection<\/a>, which describes the adjectives and adverbs of a process (the BABOK refers to these as <strong>attributes<\/strong>).  The BABOK further describes <strong>relationships<\/strong> or <strong>associations<\/strong> between entities and attributes (entities-attributes, entities-entities, attributes-attributes).  Finally, this information is often represented in the form of <strong>diagrams<\/strong>.<\/p>\n<p>Different types of data models are generated during different phases of an engagement (per my six-phase, iterative framework).<\/p>\n<p>The <strong>conceptual data model<\/strong> is created during the <em>conceptual model<\/em> phase (oooh, there&#8217;s a shock!).  This shows how the business thinks of its data, and these diagrams are produced as the result of the discovery and data collection  processes mentioned above.  This work may be folded into other phases if the engagement is meant to build something new, as opposed to modifying (or simulating) something that already exists.<\/p>\n<p>The <strong>logical data model<\/strong> is typically developed during the <em>requirements<\/em> and <em>design<\/em> phases.  This is an extension or abstraction of the conceptual data model that describes the relationships and rules for <a href=\"https:\/\/en.wikipedia.org\/wiki\/Database_normalization\">normalization<\/a> that help govern and ensure the integrity of the data representation.<\/p>\n<p>The <strong>physical data model<\/strong> is defined during the <em>implementation<\/em> phase.  This shows how the data is physically and logically arranged in memory, files structures, databases, and so on.<\/p>\n<p>There are many ways to list and describe data in diagrams.<\/p>\n<p>This diagram shows the nouns and some implied verbs of a system, sometimes using slightly different verbiage.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.rpchurchill.com\/presentations\/SimFrameForBA\/Process_Callouts.png\" width=\"500px\" \/><\/p>\n<p>Here is a representation of the attributes associated with each identified entity.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.rpchurchill.com\/presentations\/BAseries\/08_Data\/Process02_wData.png\" width=\"500px\" \/><\/p>\n<p>Here is a simple representation of the physical location of data in an implemented system.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/rpchurchill.com\/p_resume\/bri\/Bric_L2_Sys_Arch_Test.jpg\" width=\"500px\"\/><\/p>\n<p>The header listing below shows a detailed description of the shared memory area from the diagram above.<\/p>\n<pre class=\"toolbar-overlay:false wrap:false height-set:true lang:default decode:true \">\n\/*  common.h\n    this file contains all declarations for the common memory map\n*\/\n\nconst short     itcPrograms   = 8;\nconst short     itcHeats      = 10;\nconst short     itcZones      = 5;\nconst short     itcPosns      = 50;\nconst short     itcRows       = 2;\nconst short     itcHigh       = 7;\nconst short     itcWide       = 21;\nconst short     itcNodes      = 147; \/\/itcWide * itcHigh;\nconst short     itcBandWid    = 8;  \/\/itcHigh + 1;\nconst short     itcMatls      = 1;\nconst short     itcCFPnt      = 12;\nconst short     itcMaxGaps    = 5;\nconst short     itcPceTypes   = 1;\nconst short     itcSoakZoneBegin = 67 * 12;\nconst short     itcIntermediateZoneBegin = 41 * 12;\nconst short     itcExternals  = 8;\n\nconst float     rtcBotView    = 0.96565;\nconst float     rtcEfurnace   = 0.90;\nconst float     rtcEsteel     = 0.79;\nconst float     rtcKRad       = 0.1713E-8 \/ (3600.0 * 144.0);\nconst float     rtcRadCof     = rtcEfurnace * rtcEsteel * rtcKRad;\nconst float     rtcTabs       = 459.67;\nconst float     rtcTstep      = 40.0;\nconst float     rtcITstep     = 1.0 \/ rtcTstep;\n\nstruct TPc {\n  char  piece_id[7];      \/\/7\n  char  melt_grade[3];    \/\/10\n  float thickness;        \/\/14\n  float width;            \/\/18\n  float length;           \/\/22\n  float aim_temp;         \/\/26\n  float aim_diff;         \/\/30\n  float priority;         \/\/34 + 2 as a filler\n};\n\nunion TKVInMsg {\n  struct {\n    char stx[3];          \/\/3 + 1 filler\n    TPc  rows[2][50];     \/\/3604\n    char time[15];        \/\/3619\n    char okflag;          \/\/3620\n    char etx[3];          \/\/3623 + 1 filler\n  } msg;\n  struct {\n    char fred[3800];\n  } str;\n};\n\nstruct TKVOutMsg {\n  char  row1ID[7];\n  char  row2ID[7];\n  short row1Temp;\n  short row2Temp;\n  short request;\n};\n\nstruct TArcKVIn {\n  double fTime;\n  TPc    pieces[2];\n  short  okflag;\n  short  count[2];\n};\n\nstruct TArcKVOut {\n  double    fTime;\n  TKVOutMsg data;\n  short     row1count;\n  short     row2count;\n};\n\nunion TArcSlb {\n  struct {\n    short     iTag;\n    double    fTime;\n  } base;\n  struct { \/\/iTag = 0\n    short     iTag0;\n    double    fTime0;\n    char      sPieceID[8];\n    char      sGrade[4];\n    short     iRebuildFlag;\n  } charge0; \/\/22bytes\n  struct { \/\/iTag = 1\n    short     iTag1;\n    double    fTime1;\n    short     iThicknessX10;\n    short     iWidthX10;\n    short     iLengthX10;\n    short     iPriority;\n    short     iAimTemp;\n    short     iAimDiff;\n  } charge1; \/\/22 bytes\n  struct { \/\/iTag = 2\n    short     iTag2;\n    double    fTime2;\n    short     iFceMode;\n    short     iPceMaxT;\n    short     iPceMinT;\n    short     iPceAvgT;\n    short     iTopTFce;\n    short     iBotTFce;\n    short     iFcePosn;\n  } rundata; \/\/26 bytes\n  struct { \/\/iTag = 3  \/\/discharge or event\n    short     iTag3;\n    double    fTime3;\n    short     iEventType;      \/\/1=disch 2=entered intermediate 3=entered soak 4=deleted\n    double    fElapsedTime;\n    short     iDischTemp;\n    short     iDischDiff;\n  } discharge; \/\/24 bytes\n  struct { \/\/iTag = 4  \/\/edit\n    short     iTag4;\n    double    fTime4;\n    char      sNewID[8];\n    short     iNewAim;\n    bool      lNewGrade;\n  } edit;      \/\/20 bytes\n};\n\nstruct TPieceData {\n  char          sPieceID[8];               \/\/ID, string\n  char          sGrade[4];                 \/\/material grade, string\n  short         iPriority;                 \/\/priority, control higher first, dim0\n  short         iAimTemp;                  \/\/desired discharge temperature, \u00b0F\n  short         iAimDiff;                  \/\/disired differential temperature, \u00b0F\n  short         iStatus;                   \/\/status of pc data, dim0\n  float         rLength;                   \/\/length, |-- to travel, in\n  float         rWidth;                    \/\/width, || to travel, in\n  float         rThickness;                \/\/thickness, above hearth, in\n  float         raT[itcWide+1][itcHigh+1]; \/\/nodal temperatures, \u00b0F\n  float         rLocation;                 \/\/distance from beginning of fce, in\n  float         rTFceTop;                  \/\/temp above piece, \u00b0F\n  float         rTFceBot;                  \/\/temp below piece, \u00b0F\n  float         rTAvg;                     \/\/current average temp, \u00b0F\n  float         rTHi;                      \/\/current highest temp, \u00b0F\n  float         rTLo;                      \/\/current lowest temp, \u00b0F\n  float         rTDiff;                    \/\/current differential temp, \u00b0F\n  float         rLTAvg;                    \/\/predicted average temp, \u00b0F\n  float         rLTHi;                     \/\/predicted highest temp, \u00b0F\n  float         rLTLo;                     \/\/predicted lowest temp, \u00b0F\n  float         rLTDiff;                   \/\/predicted differential temp, \u00b0F\n  float         raVFSkid[itcWide+1][8][8]; \/\/bottom view factors, norm 1=square, 2=norm, 3 = norm,ofs, 4 = ofs, 5 = ofs,center, 6 = norm,ofs,center, 7 = norm,center\n                                           \/\/  skids @ -28.25,-22.75, 0.0, 22.75, 28.25, []-22.75, []28.25\n  float         raDSkid[itcWide+1][8][8];  \/\/distance to skid\n  float         raWSkid[itcWide+1][8][8];  \/\/width of skid at that distance\n  short         iSkid1a;\n  short         iSkid1b;\n  short         iSkid2a;\n  short         iSkid2b;\n  short         iCenter;\n  bool          lInFce;                    \/\/flag for piece in fce, logical\n  bool          lCalcFlag;\n  short         iArcIndex;                 \/\/which archive record written next\n  TArcSlb       uaArcRecords[4];           \/\/archive record buffer\n  TDateTime     fChargeTime;               \/\/time piece charged\n  int           dTimeRemaining;            \/\/estimated time until piece discharges\n  char          sArchiveFileName[50];      \/\/name & location of archive file\n};\n\nstruct TZone {\n  short         iTC1;                      \/\/2\n  short         iTC2;                      \/\/2\n  float         rTAv;                      \/\/4\n  short         iMTC;                      \/\/2\n  short         iL1Spt;                    \/\/2\n  short         iL2Spt;                    \/\/2\n  float         rFuelPct;                  \/\/4\n  float         rAirPct;                   \/\/4\n  float         rMode;                     \/\/4\n};  \/\/26 bytes\n\nstruct TDisplayPieceData {\n  char          sPieceID[8];               \/\/ 8\/ 8\/ID, string\n  char          sGrade[4];                 \/\/ 4\/12\/material grade, string\n  short         iPriority;                 \/\/ 2\/14\/priority, control higher first, dim0\n  short         iAimTemp;                  \/\/ 2\/16\/desired discharge temperature, \u00b0F\n  short         iAimDiff;                  \/\/ 2\/18\/disired differential temperature, \u00b0F\n  short         iStatus;                   \/\/ 2\/20\/status of pc data, dim0\n  float         rLength;                   \/\/ 4\/24\/length, |-- to travel, in\n  float         rWidth;                    \/\/ 4\/28\/width, || to travel, in\n  float         rThickness;                \/\/ 4\/32\/thickness, above hearth, in\n  float         rLocation;                 \/\/ 4\/36\/distance from beginning of fce, in\n  short         rTFceTop;                  \/\/ 2\/38\/temp above piece, \u00b0F\n  short         rTFceBot;                  \/\/ 2\/40\/temp below piece, \u00b0F\n  short         rTAvg;                     \/\/ 2\/42\/current average temp, \u00b0F\n  short         rTHi;                      \/\/ 2\/44\/current highest temp, \u00b0F\n  short         rTLo;                      \/\/ 2\/46\/current lowest temp, \u00b0F\n  short         rTDiff;                    \/\/ 2\/48\/current differential temp, \u00b0F\n  short         rLTAvg;                    \/\/ 2\/50\/predicted average temp, \u00b0F\n  short         rLTHi;                     \/\/ 2\/52\/predicted highest temp, \u00b0F\n  short         rLTLo;                     \/\/ 2\/54\/predicted lowest temp, \u00b0F\n  short         rLTDiff;                   \/\/ 2\/56\/predicted differential temp, \u00b0F\n  bool          lInFce;                    \/\/ 2\/58\/flag for piece in fce, logical\n  TDateTime     fChargeTime;               \/\/ 8\/66\/time piece charged\n  int           dTimeRemaining;            \/\/ 4\/70\/estimated time until piece discharges\n};  \/\/70 total bytes + 2 spacers\n\nstruct TViewData {\n  char              sDummy[4];                      \/\/-   4\/\n  TDisplayPieceData PC[itcPosns][itcRows];          \/\/-7200\/\n  short             iaAlarms[10];                   \/\/-  20\/\n  double            faLevel2Elapsed[itcPrograms];   \/\/-  64\/ time since last iteration began\n  TDateTime         faLevel2Start[itcPrograms];     \/\/-  64\/ time last iteration began\n  short             iaLevel2Cycle[itcPrograms];     \/\/-  16\/ number of seconds for typical loop\n  short             iaLevel2Death[itcPrograms];     \/\/-  16\/ max number of seconds until program declared dead\n  char              saLevel2Names[itcPrograms][30]; \/\/- 240\/ program name strings (30 characters each\n  short             iaZoneSetpoints[itcZones];      \/\/    8\/\n  short             iModelNotReady;                 \/\/-   2\/\n  short             iCombMode;                      \/\/-   2\/\n  short             iaDischTempError[itcRows];      \/\/-   4\/\n  short             iaSlabsInFurnace[itcRows];      \/\/-   4\/\n  short             iaSlabsInKVList[itcRows];       \/\/-   4\/\n  short             iaSlabsOutside[itcRows];        \/\/-   4\/\n  int               dDelayTimeToStart;              \/\/-   4\/\n  int               dDelayTimeToEnd;                \/\/-   4\/\n  short             iDelayStatus;                   \/\/-   2\/\n  short             iL1toL2Retries;                 \/\/-   2\/\n  short             iL2toL1Retries;                 \/\/-   2\/\n  float             rModelDuration;                 \/\/-   4\/\n  int               dPieceCalcs;                    \/\/-   4\/\n  float             rTotalInchesPerHour;            \/\/-   4\/\n  float             raInchesPerHour[itcRows];       \/\/-   8\/\n  short             iaFirstStandAvgT[itcRows];      \/\/-   4\/\n  short             iaFirstStandTopT[itcRows];      \/\/-   4\/\n  float             rHearthCoveragePercent;         \/\/-   4\/\n  short             iKVOKFlag;                      \/\/-   2\/\n  TZone             uaZones[itcZones];              \/\/- 104\/\n  TDateTime         fLevel2Time;                    \/\/    8\/\n  float             rPressure;                      \/\/-   4\/\n  float             rPressureSpt;                   \/\/-   4\/\n  short             iWasteGasTemp;                  \/\/-   2\/\n  short             iaDischarges[itcRows];          \/\/-   4\/\n  short             iaAimTemp[4];                   \/\/-   8\/\n  short             iaUseL1AimFlag[4];              \/\/-   8\/\n  short             iCoolingTime;                   \/\/-   2\/\n  short             iBPZOffset;                     \/\/-   2\/\n  short             iBIZOffset;                     \/\/-   2\/\n  short             iaCriticalPos[3];               \/\/-   6\/\n  short             iaCriticalRow[3];               \/\/-   6\/\n  short             iaCurrentDischarges[itcRows];   \/\/-   4\/\n};  \/\/8056\n\nstruct TL1Data {\n  TZone         uaZones[itcZones+1];\n  float         rPressure;\n  float         rPressureSpt;\n  short         iWasteGasTemp;\n  short         iaDischarges[itcRows+1];\n  short         iaAimTemp[4+1];\n  short         iaUseL1AimFlag[4+1];\n  short         iPZRampDownRate;\n  short         iPZMinTemp;\n  short         iPZRampUpRate;\n  short         iIZRampDownRate;\n  short         iIZMinTemp;\n  short         iIZRampUpRate;\n  short         iSZRampDownRate;\n  short         iSZMinTemp;\n  short         iSZRampUpRate;\n  int           iDelayDuration;\n  short         iStartHour;\n  short         iStartMinute;\n  char          sStartSlabID[8];\n  short         iImmediateDelayStart;\n  short         iScheduledDelayStart;\n  short         iRecoverFromDelay;\n  short         iEndDelay;\n  short         iDurationChange;\n  short         iChangeDurationFlag;\n  short         iCoolingTime;\n  short         iBPZOffset;\n  short         iBIZOffset;\n  short         iaThickMaxSpt[itcZones+1];\n  short         iaThinMaxSpt[itcZones+1];\n  int           dWatchDog;\n};\n\nstruct TArcEvent {\n  double      fTime;\n  float       rPressure;\n  float       rPressureSpt;\n  float       rHearthCoverage;\n  short       iMode;\n  short       iaAlarms[10];\n  char        saChargeID[itcRows][8];\n  char        saChargeGrade[itcRows][4];\n  char        saDischID[itcRows][8];\n  char        saDischGrade[itcRows][4];\n  short       iaDischTemp[itcRows];\n  short       iaDischAimTemp[itcRows];\n  float       raAvgDischargeTime[itcRows];\n  float       raAvgInchesPerSecond[itcRows];\n  short       iDelayMode;\n  int         dTimeToStart;\n  int         dTimeFromStart;\n  int         dTimeToEnd;\n  short       iWasteGasTemp;\n  TZone       uaZones[itcZones];\n  char        iaOutsideCount[itcRows];\n  short       iModelNotReady;\n};\n\nstruct TAuxData {\n  TKVInMsg  KVAuxIn;\n  TKVOutMsg KVAuxOut;\n  bool      lAuxIn;\n  bool      lAuxOut;\n  char      sID[8];\n  char      sGrade[4];\n  int       dIDCount;\n  float     rLength;\n  float     rWidth;\n  float     rThickness;\n  float     rCycleTime;\n  float     rAimTemp;\n  float     rAimDiff;\n  short     iPriority;\n  float     rTimeStep;\n  float     rRunTime;\n  bool      lRandomPDI;\n  bool      lRunning;\n  bool      lDataOK;\n  bool      lSendChange;\n  short     iaRowCount[itcRows];\n  short     iNextRow;\n  char      sDateTime[15];\n  TZone     uaZones[itcZones+1];\n  bool      lZone1TC1Disabled;\n  bool      lZone1TC2Disabled;\n  bool      lZone1MTCDisabled;\n  bool      lZone2TC1Disabled;\n  bool      lZone2TC2Disabled;\n  bool      lZone2MTCDisabled;\n  bool      lZone3TC1Disabled;\n  bool      lZone3TC2Disabled;\n  bool      lZone3MTCDisabled;\n  bool      lZone4TC1Disabled;\n  bool      lZone4TC2Disabled;\n  bool      lZone4MTCDisabled;\n  bool      lZone5TC1Disabled;\n  bool      lZone5TC2Disabled;\n  bool      lZone5MTCDisabled;\n  bool      lWasteGasTCDisabled;\n  float     rPressure;\n  float     rPressureSpt;\n  short     iWasteGasTemp;\n  short     iaDischCount[itcRows];\n  short     iLv1Watchdog;\n  short     iaDefAimTemp[4+1];\n  short     iaUseL1AimFlag[4+1];\n  short     iModelNotReady;\n  short     iaL2Alarms[11];\n  short     iLv2Watchdog;\n  short     iLv2Year;\n  short     iLv2Month;\n  short     iLv2Day;\n  short     iLv2Hour;\n  short     iLv2Minute;\n  short     iLv2Second;\n  short     iLv2DchTemp1Error;\n  short     iLv2DchTemp2Error;\n  short     iLv2TimeToStart;\n  short     iLv2TimeToEnd;\n  short     iLv2ReplyFlag;\n  short     iLv2Dummy[4];\n  short     iDelayCommFlag;\n  short     iDelayTimeToStart;\n  short     iDelayTimeToEnd;\n  short     iPZRampDownRate;\n  short     iPZMinTemp;\n  short     iPZRampUpRate;\n  short     iIZRampDownRate;\n  short     iIZMinTemp;\n  short     iIZRampUpRate;\n  short     iSZRampDownRate;\n  short     iSZMinTemp;\n  short     iSZRampUpRate;\n  short     iDelayDuration;\n  short     iStartHour;\n  short     iStartMinute;\n  char      sStartSlabID[10];\n  short     iImmediateDelayStart;\n  short     iScheduledDelayStart;\n  short     iRecoverFromDelay;\n  short     iDurationChange;\n  short     iChangeDurationFlag;\n  short     iEndDelay;\n  short     iBPZOffset;\n  short     iBIZOffset;\n  short     itcStandAloneFactor;\n  short     iCoolingTime;\n  bool      laNoCharge[itcRows];\n  bool      laNoDischarge[itcRows];\n  bool      lDecayTemps;\n  short     iaSlabsOutside[itcRows+1];\n  short     iaThickMaxSpt[itcZones+1];\n  short     iaThinMaxSpt[itcZones+1];\n};\n\nstruct TCommonData {\n  TL1Data       L1;                                \/\/level 1 data\n  double        f2aLevel2Elapsed[itcPrograms+1];   \/\/time since last iteration began\n  TDateTime     f2aLevel2Start[itcPrograms+1];     \/\/time last iteration began\n  short         i2aAlarms[11];                     \/\/alarm values\n  short         i2aLevel2Cycle[itcPrograms+1];     \/\/number of seconds for typical loop\n  short         i2aLevel2Death[itcPrograms+1];     \/\/max number of seconds until program declared dead\n  int           dtWatchDogCount;\n  char          s2aLevel2Names[itcPrograms+1][30]; \/\/program name strings (30 characters each\n  TPieceData    PC[itcPosns+1][itcRows+1];         \/\/pieces in furnace by position and row (east\/center\/west)\n  TPieceData    SavePC[itcPosns+1][itcRows+1];     \/\/saved pieces in furnace by position and row (east\/center\/west)\n  TPieceData    utZeroPiece;                       \/\/sample piece record filled with null data\n  TPieceData    utaFirstTwoPieces[itcRows+1];\n  short         itaFirstStandTemps[itcRows+1];\n  short         itaFirstStandTops[itcRows+1];\n  short         itaZoneSpt[itcZones+1];            \/\/zone setpoints to be sent down to level 1\n  TZone         utaZones[itcZones+1];              \/\/zone data\n  TZone         utaSaveZones[itcZones+1];          \/\/saved zone data\n  short         itSaveWasteGasTemp;\n  TL1Data       L2;\n  char          staOldChargeID[9][itcRows+1];\n  char          staOldDischargeID[9][itcRows+1];\n  short         itaOldCharges[itcRows+1];\n  short         itaOldDischarges[itcRows+1];\n  short         itDay;\n  short         itMonth;\n  short         itYear;\n  long          dtDefaultID;\n  char          stPieceArchivePath[30];\n  char          stEventArchivePath[30];\n  char          stKVArchivePath[30];\n  int           dtaLastFiftyCharges[51][itcRows+1];\n  float         rtaLastFiftyWidths[51][itcRows+1];\n  int           dtaModelLastFiftyCharges[51][itcRows+1];\n  float         rtaModelLastFiftyWidths[51][itcRows+1];\n  float         rtaLastTenInchesPerSecond[11][itcRows+1];\n  float         rtaAvgDischargeTime[itcRows+1];\n  float         rtaAvgDischargeWidths[itcRows+1];\n  float         rtaAvgInchesPerSecond[itcRows+1];\n  float         rtaTopTCOffsets[11+1];\n  float         rtaBotTCOffsets[11+1];\n  char          staOldChargeBloomID[10][itcRows+1];\n  bool          ltSendDischargeData;\n  bool          ltDischargeDataSent;\n  bool          ltStandAlone;\n  bool          ltCompact;\n  bool          ltGraphics;\n  bool          ltArchive;\n  TKVInMsg      utKVInMsg;\n  TKVInMsg      utKVIn;\n  TKVOutMsg     utKVOutMsg;\n  TKVOutMsg     utKVOut;\n  float         rtFceLength;\n  float         rtFceWidth;\n  float         rtFceArea;\n  short         itModelNotReady;\n  short         itaDischTempError[itcRows+1];\n  float         rtHearthCoveragePct;\n  short         itTAmbient;\n  int           dtDelayDuration;\n  int           dtDelayTimeToStart;\n  int           dtDelayTimeFromStart;\n  int           dtDelayTimeToEnd;\n  short         itaDelayInitialTemps[4];\n  int           dtaDelayRampDownTimeLeft[4];\n  int           dtaDelayMinTempTimeLeft[4];\n  int           dtaDelayRampUpTimeLeft[4];\n  short         itaDelayRampDownRate[4];\n  short         itaDelayMinTemp[4];\n  short         itaDelayRampUpRate[4];\n  int           dtaDelayRampDownTime[4];\n  int           dtaDelayMinTempTime[4];\n  int           dtaDelayRampUpTime[4];\n  bool          ltInDelay;\n  short         itDelayPrimaryTurnDown;\n  short         itDelayIntermediateTurnDown;\n  short         itaCriticalPos[4];\n  short         itaCriticalRow[4];\n  float         rtaZoneError[4];\n  float         rtaZoneAdjust[4];\n  float         rtaZoneResult[4];\n  float         rtaZoneNudge[4];\n  float         rtaZoneDiff[4];\n  float         rtaZoneDiffError[4];\n  short         itaSlabsInFurnace[itcRows+1];\n  short         itaSlabsInKVList[itcRows+1];\n  short         itaSlabsOutside[itcRows+1];\n  double        ftStartTime;\n  short         itDelayMode;\n  short         itDelayOldMode;\n  short         itDelayStatus;\n  short         itDelayCommFlag;\n  bool          ltPredict;\n  bool          ltControl;\n  short         itDelayTempMsgCount;\n  float         rtaInternalL2Setpoints[itcZones+1];\n  short         itcStandAloneFactor;\n  short         itaPastTAvgs[401][itcZones+1];\n  short         itaPastMTCs[401][itcZones+1];\n  short         itaPastWGTs[401];\n  short         itaPastRates[401];\n  short         itPastTempCount;\n  short         itaPastDischarges[401][itcRows+1];\n  bool          ltaZoneAvTError[itcZones+1];\n  bool          ltaZoneMTCError[itcZones+1];\n  bool          ltWasteGasTCError;\n  float         rtaZoneMaxSpt[itcZones+1];\n  float         rtaZoneMinSpt[itcZones+1];\n  float         rtcZoneMaxStep;\n  float         rtcZoneMinStep;\n  float         rtcZoneMaxVar;\n  short         itcaZoneMTCOffset[itcZones+1];\n  short         itCombMode;\n  short         itL1toL2Retries;\n  short         itL2toL1Retries;\n  char          staIPAddresses[itcExternals+3][16];\n  char          staPortAddresses[itcExternals+3][6];\n  bool          ltaNetworkOKFlags[itcExternals+3];\n  bool          ltaAddressChanged[itcExternals+3];\n  bool          ltaValidAddresses[itcExternals+3];\n  bool          ltModelFlag;\n  TViewData     V;\n  int           dtatemp[201];\n  float         ftatemp[201];\n  bool          ltatemp[201];\n  char          statemp[201][101];\n};\n<\/pre>\n<p>Here is a more complicated and explicit representation of data in a database.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.researchgate.net\/profile\/Udo-Kruschwitz\/publication\/225718701\/figure\/fig5\/AS:1007390744920064@1617192078087\/The-relational-database-representation-of-SGF.png\" width=\"500px\" alt=\"image linked from a paper on researchgate.net, ma be subject to copyright\" \/><\/p>\n<p>The BABOK describes two specific types of diagrams, an Entity-Relationship Diagram using Crow&#8217;s Foot notation, and a Class Diagram from <a href=\"https:\/\/www.goodreads.com\/book\/show\/1069001.Teach_Yourself_Uml_In_24_Hours\">UML<\/a>.  I recommend researching these two types of diagrams as questions about them may arise on the CBAP exam and other exams.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>From the BABOK: A data model describes the entities, classes or data objects relevant to a domain, the attributes that are used to describe them, and the relationships among them to provide a common set of semantics for analysis and &hellip; <a href=\"https:\/\/rpchurchill.com\/wordpress\/posts\/2022\/03\/28\/data-modeling\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[192,186,236,7],"_links":{"self":[{"href":"https:\/\/rpchurchill.com\/wordpress\/wp-json\/wp\/v2\/posts\/2529"}],"collection":[{"href":"https:\/\/rpchurchill.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpchurchill.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpchurchill.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/rpchurchill.com\/wordpress\/wp-json\/wp\/v2\/comments?post=2529"}],"version-history":[{"count":9,"href":"https:\/\/rpchurchill.com\/wordpress\/wp-json\/wp\/v2\/posts\/2529\/revisions"}],"predecessor-version":[{"id":3018,"href":"https:\/\/rpchurchill.com\/wordpress\/wp-json\/wp\/v2\/posts\/2529\/revisions\/3018"}],"wp:attachment":[{"href":"https:\/\/rpchurchill.com\/wordpress\/wp-json\/wp\/v2\/media?parent=2529"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpchurchill.com\/wordpress\/wp-json\/wp\/v2\/categories?post=2529"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpchurchill.com\/wordpress\/wp-json\/wp\/v2\/tags?post=2529"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}