# Data-flow diagrams and exchange-system relationships

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h2>What a data-flow diagram shows</h2>
<p>A data-flow diagram (DFD) represents where data comes from, how a system transforms it, where it is stored and where it goes. It focuses on logical data relationships rather than screen layout, program-control order or network hardware.</p>
<div style="background: #eef6fb; border-left: 4px solid #2b6f91; border-radius: 4px; padding: 0.8rem 1rem; margin: 1rem 0;">
  <p style="margin: 0;"><strong>Ask four questions:</strong> Who supplies or receives data? What process transforms it? Where is it stored? What data crosses each connection?</p>
</div>
<p>A DFD can contain physical objects and manual storage as well as digital data. For example, a library process may receive a book identifier, update a digital record and release a physical book from a shelf.</p>

<h4>DFD or flowchart?</h4>
<p><strong>Determine</strong> which representation best suits each purpose.</p>
<ol>
  <li>Show the decisions and repetition in an account-login algorithm.</li>
  <li>Show how login credentials move from a user to a verification process and user store.</li>
</ol>
<details style="background: #f4f8f6; border: 1px solid #c8ddd1; border-radius: 4px; padding: 0.65rem 0.85rem; margin: 0.8rem 0;">
  <summary style="color: #245b45; font-weight: 600; cursor: pointer;">Check your answer</summary>
  <ol>
    <li>A flowchart or pseudocode is appropriate because the purpose is to show algorithm control and decisions.</li>
    <li>A DFD is appropriate because the purpose is to show data sources, transformation, storage and movement.</li>
  </ol>
</details>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h2>The four Gane–Sarson elements</h2>
<p>QCAA Digital Solutions uses Gane–Sarson notation. Copy the shapes accurately enough that their different functions are unambiguous.</p>
<svg viewBox="0 0 800 360" role="img" aria-labelledby="symbol-title symbol-desc" style="display: block; width: 100%; max-width: 800px; height: auto; margin: 1rem auto;">
  <title id="symbol-title">Four Gane-Sarson data-flow diagram elements</title>
  <desc id="symbol-desc">Examples of an external entity, process, data store and labelled directional data flow.</desc>
  <rect x="30" y="45" width="180" height="90" fill="#f7fafc" stroke="#245f7a" stroke-width="3"></rect>
  <text x="120" y="82" text-anchor="middle" font-family="sans-serif" font-size="18" font-weight="700">Student</text>
  <text x="120" y="110" text-anchor="middle" font-family="sans-serif" font-size="15">External entity</text>
  <rect x="300" y="35" width="210" height="110" rx="12" fill="#eef6fb" stroke="#245f7a" stroke-width="3"></rect>
  <line x1="300" y1="70" x2="510" y2="70" stroke="#245f7a" stroke-width="2"></line>
  <text x="320" y="59" font-family="sans-serif" font-size="16" font-weight="700">1.0</text>
  <text x="405" y="108" text-anchor="middle" font-family="sans-serif" font-size="18" font-weight="700">Check booking</text>
  <text x="405" y="132" text-anchor="middle" font-family="sans-serif" font-size="14">Process</text>
  <rect x="595" y="45" width="175" height="90" fill="#f7fafc" stroke="#245f7a" stroke-width="3"></rect>
  <line x1="640" y1="45" x2="640" y2="135" stroke="#245f7a" stroke-width="2"></line>
  <text x="617" y="97" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="700">D1</text>
  <text x="705" y="85" text-anchor="middle" font-family="sans-serif" font-size="17" font-weight="700">Bookings</text>
  <text x="705" y="111" text-anchor="middle" font-family="sans-serif" font-size="14">Data store</text>
  <line x1="140" y1="255" x2="650" y2="255" stroke="#245f7a" stroke-width="3"></line>
  <polygon points="650,255 632,245 632,265" fill="#245f7a"></polygon>
  <text x="395" y="237" text-anchor="middle" font-family="sans-serif" font-size="18" font-weight="700">booking request</text>
  <text x="395" y="286" text-anchor="middle" font-family="sans-serif" font-size="15">Labelled data flow; arrow shows direction</text>
</svg>
<table style="width: 100%; border-collapse: collapse; margin: 1rem 0;">
  <thead>
    <tr style="background: #245f7a; color: #ffffff;"><th style="padding: 0.65rem; text-align: left; border: 1px solid #d5e0e6;">Element</th><th style="padding: 0.65rem; text-align: left; border: 1px solid #d5e0e6;">Job</th><th style="padding: 0.65rem; text-align: left; border: 1px solid #d5e0e6;">Naming convention</th></tr>
  </thead>
  <tbody>
    <tr style="background: #f7fafc;"><td style="padding: 0.65rem; border: 1px solid #d5e0e6;"><strong>External entity</strong></td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">A source or destination outside the area being studied.</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Noun, such as <em>Student</em> or <em>Payment service</em>.</td></tr>
    <tr><td style="padding: 0.65rem; border: 1px solid #d5e0e6;"><strong>Process</strong></td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Transforms incoming data into outgoing data.</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Verb or verb–object name, such as <em>Check booking</em>.</td></tr>
    <tr style="background: #f7fafc;"><td style="padding: 0.65rem; border: 1px solid #d5e0e6;"><strong>Data store</strong></td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">A repository holding data for later use.</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Numbered noun, such as <em>D1 Bookings</em>.</td></tr>
    <tr><td style="padding: 0.65rem; border: 1px solid #d5e0e6;"><strong>Data flow</strong></td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Shows data moving in the arrow's direction.</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Noun describing the actual data, such as <em>booking request</em>.</td></tr>
  </tbody>
</table>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h3>Classify each system component</h3>
<p>A canteen ordering system includes a student, a process that calculates the order total, a collection of menu records and the order details sent into that process.</p>
<p><strong>Recognise</strong> each DFD element and give it a suitable label.</p>
<details style="background: #f4f8f6; border: 1px solid #c8ddd1; border-radius: 4px; padding: 0.65rem 0.85rem; margin: 0.8rem 0;">
  <summary style="color: #245b45; font-weight: 600; cursor: pointer;">Check your answer</summary>
  <ul>
    <li><strong>External entity:</strong> Student</li>
    <li><strong>Process:</strong> 1.0 Calculate order total</li>
    <li><strong>Data store:</strong> D1 Menu</li>
    <li><strong>Data flow:</strong> order details</li>
  </ul>
</details>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h2>Name and number elements precisely</h2>
<p>Good labels allow a reader to understand the system without guessing.</p>
<ul>
  <li>Use nouns for entities, flows and stores: <em>Customer</em>, <em>payment details</em>, <em>Orders</em>.</li>
  <li>Use verbs or verb–object names for processes: <em>Validate payment</em>, <em>Record order</em>.</li>
  <li>Number processes: <em>1.0 Validate request</em>, <em>2.0 Record booking</em>.</li>
  <li>Number and type stores: <em>D1 Accounts</em>, <em>M1 Paper forms</em>, <em>T1 Session cache</em>.</li>
</ul>
<table style="width: 100%; border-collapse: collapse; margin: 1rem 0;">
  <thead>
    <tr style="background: #245f7a; color: #ffffff;"><th style="padding: 0.65rem; text-align: left; border: 1px solid #d5e0e6;">Prefix</th><th style="padding: 0.65rem; text-align: left; border: 1px solid #d5e0e6;">Store type</th><th style="padding: 0.65rem; text-align: left; border: 1px solid #d5e0e6;">Example</th></tr>
  </thead>
  <tbody>
    <tr style="background: #f7fafc;"><td style="padding: 0.65rem; border: 1px solid #d5e0e6;"><strong>D</strong></td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Data on disk, retained when power is off</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">D1 Accounts database</td></tr>
    <tr><td style="padding: 0.65rem; border: 1px solid #d5e0e6;"><strong>M</strong></td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Manual data: physical files, paper records or manually processed digital data</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">M1 Consent forms</td></tr>
    <tr style="background: #f7fafc;"><td style="padding: 0.65rem; border: 1px solid #d5e0e6;"><strong>T</strong></td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Temporary or transient data, not retained long-term</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">T1 Session cache</td></tr>
  </tbody>
</table>
<div style="background: #fff7e6; border-left: 4px solid #b7791f; border-radius: 4px; padding: 0.8rem 1rem; margin: 1rem 0;">
  <p style="margin: 0;"><strong>Avoid vague labels:</strong> <em>data</em>, <em>information</em>, <em>do booking</em> and <em>system</em> hide the relationship. Name the actual data and transformation.</p>
</div>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h3>Repair the labels</h3>
<p>A draft DFD uses <em>Member</em> for an entity, <em>Bookings</em> for a process, <em>Save</em> for a data store and <em>data</em> for a flow containing a requested date and room identifier.</p>
<p><strong>Analyse</strong> the labels and rewrite the three unsuitable ones.</p>
<details style="background: #f4f8f6; border: 1px solid #c8ddd1; border-radius: 4px; padding: 0.65rem 0.85rem; margin: 0.8rem 0;">
  <summary style="color: #245b45; font-weight: 600; cursor: pointer;">View a sample solution</summary>
  <ul>
    <li><em>Member</em> is already a suitable noun for the entity.</li>
    <li>Rename the process <em>1.0 Create booking</em> to state its transformation.</li>
    <li>Rename the store <em>D1 Bookings</em> because a store uses a noun and identifier.</li>
    <li>Rename the flow <em>date and room ID</em> or <em>booking request</em> to identify its contents.</li>
  </ul>
</details>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h2>Connections must pass through a process</h2>
<p>A process is the active element that transforms, validates, records or retrieves data. Therefore an external entity cannot exchange data directly with another external entity or a data store.</p>
<table style="width: 100%; border-collapse: collapse; margin: 1rem 0;">
  <thead>
    <tr style="background: #245f7a; color: #ffffff;"><th style="padding: 0.65rem; text-align: left; border: 1px solid #d5e0e6;">Connection</th><th style="padding: 0.65rem; text-align: left; border: 1px solid #d5e0e6;">Valid?</th><th style="padding: 0.65rem; text-align: left; border: 1px solid #d5e0e6;">Reason</th></tr>
  </thead>
  <tbody>
    <tr style="background: #f7fafc;"><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Entity → process</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Yes</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">The process receives data to transform.</td></tr>
    <tr><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Process → store</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Yes</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">The process writes data to storage.</td></tr>
    <tr style="background: #f7fafc;"><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Store → process</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Yes</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">The process retrieves stored data.</td></tr>
    <tr><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Entity → store</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">No</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Data must be processed first.</td></tr>
    <tr style="background: #f7fafc;"><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">Entity → entity</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">No</td><td style="padding: 0.65rem; border: 1px solid #d5e0e6;">That exchange is outside the represented system unless a process handles it.</td></tr>
  </tbody>
</table>
<p>Use a separate arrow for each direction. A request and reply are different flows and should be labelled separately.</p>

<h4>Find three convention errors</h4>
<p>A draft diagram shows a <em>Customer</em> entity sending <em>details</em> directly to <em>D1 Orders</em>. The store sends <em>stuff</em> directly to a <em>Kitchen</em> entity. A process between them is named <em>Order</em>.</p>
<p><strong>Analyse</strong> the draft and describe three corrections.</p>
<details style="background: #f4f8f6; border: 1px solid #c8ddd1; border-radius: 4px; padding: 0.65rem 0.85rem; margin: 0.8rem 0;">
  <summary style="color: #245b45; font-weight: 600; cursor: pointer;">Check your answer</summary>
  <ol>
    <li>Route the customer's <em>order details</em> through a process before D1 Orders.</li>
    <li>Route stored order data through a process before outputting a <em>kitchen order</em> to Kitchen.</li>
    <li>Rename and number the process with a verb–object label, such as <em>1.0 Record order</em>.</li>
  </ol>
</details>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h2>Worked example: equipment loans</h2>
<p>A student submits a student ID and equipment ID. The system checks the equipment record, stores an approved loan and returns either a collection notice or an unavailable notice.</p>
<svg viewBox="0 0 940 420" role="img" aria-labelledby="loan-title loan-desc" style="display: block; width: 100%; max-width: 940px; height: auto; margin: 1rem auto;">
  <title id="loan-title">Data-flow diagram for an equipment loan system</title>
  <desc id="loan-desc">A Student entity sends student ID and equipment ID to Check availability. That process reads equipment status from D1 Equipment. Available loan details go to Record loan, which writes a loan record to D2 Loans and sends a collection notice to the Student. Check availability can also send an unavailable notice to the Student.</desc>
  <defs><marker id="loan-arrow" markerWidth="9" markerHeight="9" refX="8" refY="4.5" orient="auto"><path d="M0,0 L9,4.5 L0,9 Z" fill="#245f7a"></path></marker></defs>
  <rect x="25" y="155" width="135" height="80" fill="#f7fafc" stroke="#245f7a" stroke-width="3"></rect>
  <text x="92" y="202" text-anchor="middle" font-family="sans-serif" font-size="18" font-weight="700">Student</text>
  <rect x="300" y="135" width="210" height="120" rx="12" fill="#eef6fb" stroke="#245f7a" stroke-width="3"></rect>
  <line x1="300" y1="170" x2="510" y2="170" stroke="#245f7a" stroke-width="2"></line>
  <text x="318" y="160" font-family="sans-serif" font-size="15" font-weight="700">1.0</text>
  <text x="405" y="215" text-anchor="middle" font-family="sans-serif" font-size="18" font-weight="700">Check availability</text>
  <rect x="710" y="25" width="200" height="80" fill="#f7fafc" stroke="#245f7a" stroke-width="3"></rect>
  <line x1="760" y1="25" x2="760" y2="105" stroke="#245f7a" stroke-width="2"></line>
  <text x="735" y="72" text-anchor="middle" font-family="sans-serif" font-size="15" font-weight="700">D1</text>
  <text x="835" y="72" text-anchor="middle" font-family="sans-serif" font-size="17" font-weight="700">Equipment</text>
  <rect x="650" y="260" width="210" height="120" rx="12" fill="#eef6fb" stroke="#245f7a" stroke-width="3"></rect>
  <line x1="650" y1="295" x2="860" y2="295" stroke="#245f7a" stroke-width="2"></line>
  <text x="668" y="285" font-family="sans-serif" font-size="15" font-weight="700">2.0</text>
  <text x="755" y="340" text-anchor="middle" font-family="sans-serif" font-size="18" font-weight="700">Record loan</text>
  <rect x="330" y="325" width="200" height="70" fill="#f7fafc" stroke="#245f7a" stroke-width="3"></rect>
  <line x1="380" y1="325" x2="380" y2="395" stroke="#245f7a" stroke-width="2"></line>
  <text x="355" y="367" text-anchor="middle" font-family="sans-serif" font-size="15" font-weight="700">D2</text>
  <text x="455" y="367" text-anchor="middle" font-family="sans-serif" font-size="17" font-weight="700">Loans</text>
  <line x1="160" y1="185" x2="300" y2="185" stroke="#245f7a" stroke-width="3" marker-end="url(#loan-arrow)"></line>
  <text x="230" y="165" text-anchor="middle" font-family="sans-serif" font-size="14">student ID, equipment ID</text>
  <path d="M510 155 L600 70 L710 70" fill="none" stroke="#245f7a" stroke-width="3" marker-end="url(#loan-arrow)"></path>
  <text x="610" y="55" text-anchor="middle" font-family="sans-serif" font-size="14">equipment ID</text>
  <path d="M710 92 L610 115 L510 185" fill="none" stroke="#245f7a" stroke-width="3" marker-end="url(#loan-arrow)"></path>
  <text x="620" y="135" text-anchor="middle" font-family="sans-serif" font-size="14">equipment status</text>
  <line x1="510" y1="225" x2="650" y2="305" stroke="#245f7a" stroke-width="3" marker-end="url(#loan-arrow)"></line>
  <text x="575" y="285" text-anchor="middle" font-family="sans-serif" font-size="14">approved loan details</text>
  <line x1="650" y1="350" x2="530" y2="360" stroke="#245f7a" stroke-width="3" marker-end="url(#loan-arrow)"></line>
  <text x="590" y="385" text-anchor="middle" font-family="sans-serif" font-size="14">loan record</text>
  <path d="M650 320 L220 280 L150 235" fill="none" stroke="#245f7a" stroke-width="3" marker-end="url(#loan-arrow)"></path>
  <text x="390" y="300" text-anchor="middle" font-family="sans-serif" font-size="14">collection notice</text>
  <path d="M300 225 L215 245 L150 220" fill="none" stroke="#245f7a" stroke-width="3" marker-end="url(#loan-arrow)"></path>
  <text x="230" y="270" text-anchor="middle" font-family="sans-serif" font-size="14">unavailable notice</text>
</svg>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h3>Trace the worked example</h3>
<p>Do not merely list connected shapes. Explain what moves, in which direction, and what each process does with it.</p>
<ol>
  <li>The Student sends a student ID and equipment ID to <em>1.0 Check availability</em>.</li>
  <li>The process sends the equipment ID to D1 Equipment and receives the equipment status.</li>
  <li>If unavailable, the process returns an unavailable notice to the Student.</li>
  <li>If available, approved loan details flow to <em>2.0 Record loan</em>.</li>
  <li>The second process writes a loan record to D2 Loans and sends a collection notice to the Student.</li>
</ol>

<h4>Explain a relationship</h4>
<p><strong>Explain</strong> the relationship between the Student entity and D2 Loans. Include any process between them.</p>
<details style="background: #f4f8f6; border: 1px solid #c8ddd1; border-radius: 4px; padding: 0.65rem 0.85rem; margin: 0.8rem 0;">
  <summary style="color: #245b45; font-weight: 600; cursor: pointer;">View a sample solution</summary>
  <p>The Student supplies a student ID and equipment ID to Check availability. If D1 Equipment returns an available status, approved loan details pass to Record loan. Record loan then writes a loan record to D2 Loans and returns a collection notice to the Student. The Student does not access D2 Loans directly.</p>
</details>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h2>Explain relationships, not just arrows</h2>
<p>An explanation should connect evidence from the complete path.</p>
<blockquote style="background: #eef6fb; border-left: 4px solid #2b6f91; border-radius: 4px; padding: 0.8rem 1rem; margin: 1rem 0;">
  <p><strong>[Source]</strong> sends [named data] to [process]. The process [transformation] using [data read from a store, if relevant], then sends or stores [named output] in [destination].</p>
</blockquote>
<p>If the diagram mixes manual, physical and digital flows, state that distinction. A paper consent form can be an M store; a physical item can flow from a manual store through a delivery process; a digital identifier can trigger that action.</p>

<h4>Build the explanation</h4>
<p>A volunteer sends a ticket code to <em>1.0 Validate ticket</em>. The process reads valid-code data from <em>D1 Tickets</em> and returns an entry decision to the volunteer.</p>
<p><strong>Explain</strong> the relationship between the Volunteer and D1 Tickets in two or three sentences.</p>
<details style="background: #f4f8f6; border: 1px solid #c8ddd1; border-radius: 4px; padding: 0.65rem 0.85rem; margin: 0.8rem 0;">
  <summary style="color: #245b45; font-weight: 600; cursor: pointer;">View a sample solution</summary>
  <p>The Volunteer sends a ticket code to Validate ticket. That process uses the code to retrieve valid-code data from D1 Tickets, compares the records and returns an entry decision to the Volunteer. The process mediates the relationship, so the Volunteer does not read the store directly.</p>
</details>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h2>Data flow within and between systems</h2>
<p>A digital solution may contain a front end, back end and database while also exchanging data with external services.</p>
<ul>
  <li><strong>Front end:</strong> collects input and presents output through the user interface.</li>
  <li><strong>Back end:</strong> validates requests, applies rules and coordinates data exchange.</li>
  <li><strong>Database:</strong> retains structured data.</li>
  <li><strong>External service:</strong> another system outside the area of study, such as a weather or payment service.</li>
</ul>
<p>Whether something is an external entity depends on the chosen system boundary. If the diagram studies a booking app, a payment service may be external. If it studies the payment provider itself, that provider contains processes and stores.</p>
<div style="background: #fff7e6; border-left: 4px solid #b7791f; border-radius: 4px; padding: 0.8rem 1rem; margin: 1rem 0;">
  <p style="margin: 0;"><strong>Do not draw technology for its own sake:</strong> a phone, Wi-Fi router or API is not automatically a DFD element. Represent a source, transformation, store or flow only when it helps explain the studied data process.</p>
</div>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h3>From scenario to DFD plan</h3>
<p>A beach-safety app receives a location from a Beachgoer. Its back end sends the location to an external Weather service, receives current conditions, combines them with alert rules from a database and returns a safety message.</p>
<p>Before drawing, extract the elements:</p>
<ul>
  <li><strong>Entities:</strong> Beachgoer; Weather service</li>
  <li><strong>Process:</strong> 1.0 Generate safety message</li>
  <li><strong>Store:</strong> D1 Alert rules</li>
  <li><strong>Flows:</strong> location, conditions request, current conditions, alert rules, safety message</li>
</ul>
<p>Notice that <em>conditions request</em> and <em>current conditions</em> are separate arrows because they travel in opposite directions.</p>

<h4>Check for understanding</h4>
<p><strong>Symbolise</strong> this scenario as a DFD on paper. Then check that every entity and store connects only through the process.</p>
<details style="background: #f4f8f6; border: 1px solid #c8ddd1; border-radius: 4px; padding: 0.65rem 0.85rem; margin: 0.8rem 0;">
  <summary style="color: #245b45; font-weight: 600; cursor: pointer;">Check your answer</summary>
  <p>A correct diagram shows Beachgoer → <em>location</em> → 1.0 Generate safety message; the process → <em>conditions request</em> → Weather service; Weather service → <em>current conditions</em> → the process; D1 Alert rules → <em>alert rules</em> → the process; and the process → <em>safety message</em> → Beachgoer.</p>
</details>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h2>Develop a DFD systematically</h2>
<ol>
  <li>Set the system boundary: decide what is inside the area of study.</li>
  <li>Underline external sources and destinations.</li>
  <li>Circle transformations described by verbs.</li>
  <li>Identify retained, manual and temporary stores.</li>
  <li>List the actual data entering and leaving each process.</li>
  <li>Draw and number processes and stores.</li>
  <li>Add one labelled arrow for each direction.</li>
  <li>Trace every path and test the conventions.</li>
</ol>

<h4>Final convention check</h4>
<ul>
  <li>Does every process have at least one meaningful input and output?</li>
  <li>Does every arrow have a noun label and a clear direction?</li>
  <li>Do all entity and store flows pass through a process?</li>
  <li>Are processes named with verbs and numbered?</li>
  <li>Are stores numbered and correctly identified as D, M or T?</li>
  <li>Does the diagram show the scenario without inventing unsupported data?</li>
</ul>

<div style="height: 2rem;" aria-hidden="true">&nbsp;</div>
<h2>Independent practice: community garden lockers</h2>
<p>A community garden lends tools through secure lockers. A Member enters a membership code and tool ID at a terminal. The system must:</p>
<ul style="background: #f7fafc; border: 1px solid #d5e0e6; border-radius: 4px; padding: 0.8rem 1rem 0.8rem 2.2rem; margin: 1rem 0;">
  <li>check the membership code against retained member records</li>
  <li>check whether the requested tool is listed as available</li>
  <li>when both checks pass, record the loan and send an unlock instruction to the external Locker controller</li>
  <li>return a collection message or rejection reason to the Member</li>
  <li>store loans on disk so they remain after the terminal is turned off.</li>
</ul>
<p>Use these required components:</p>
<ul>
  <li>external entities: Member and Locker controller</li>
  <li>processes: Validate request and Record loan</li>
  <li>data stores: Members, Tools and Loans.</li>
</ul>
<p>On paper, <strong>develop</strong> a complete Gane–Sarson DFD. Number all processes and stores, identify each store type, and label every flow with the data it carries. Then <strong>explain</strong> the relationship between the Member and Loans store.</p>
<details style="background: #f4f8f6; border: 1px solid #c8ddd1; border-radius: 4px; padding: 0.65rem 0.85rem; margin: 0.8rem 0;">
  <summary style="color: #245b45; font-weight: 600; cursor: pointer;">View a sample solution</summary>
  <h4>Elements and flows</h4>
  <ul>
    <li>Member → <em>membership code, tool ID</em> → 1.0 Validate request</li>
    <li>1.0 Validate request → <em>membership code</em> → D1 Members</li>
    <li>D1 Members → <em>member status</em> → 1.0 Validate request</li>
    <li>1.0 Validate request → <em>tool ID</em> → D2 Tools</li>
    <li>D2 Tools → <em>tool availability</em> → 1.0 Validate request</li>
    <li>1.0 Validate request → <em>approved loan details</em> → 2.0 Record loan</li>
    <li>1.0 Validate request → <em>rejection reason</em> → Member</li>
    <li>2.0 Record loan → <em>loan record</em> → D3 Loans</li>
    <li>2.0 Record loan → <em>unlock instruction</em> → Locker controller</li>
    <li>2.0 Record loan → <em>collection message</em> → Member</li>
  </ul>
  <p>D1, D2 and D3 are disk stores because the scenario describes retained records.</p>
  <h4>Relationship explanation</h4>
  <p>The Member sends a membership code and tool ID to Validate request. That process checks member status from D1 Members and tool availability from D2 Tools. When both checks pass, approved loan details flow to Record loan, which writes a loan record to D3 Loans and returns a collection message. The Member therefore affects and receives confirmation of stored loan data through two processes rather than accessing the store directly.</p>
</details>