Views Without Duplication: How One Model Produces Many Diagrams
Ask most architecture teams how many places a given application shows up as a box, and the honest answer is usually "nobody actually knows." It's on the landscape diagram from last year's portfolio review, on a security diagram someone built for an audit, on an integration diagram buried in a wiki page nobody has opened since the project closed. Four pictures, four separate objects as far as the drawing tool is concerned, and nothing guaranteeing any of them still agree with each other, let alone with reality. Views without duplication is the alternative: one element, referenced — never copied — into as many diagrams as the organization needs, so that a fact recorded once is true everywhere it's shown.
The duplication trap, and why it's structural
The problem isn't that architects are careless about keeping diagrams in sync. It's that most tools never gave them a way to avoid the sync problem in the first place. Draw "Fraud Engine" on a landscape diagram and it's a rectangle with a label. Draw it again on a security diagram because the audit needs to see it there too, and — unless the tool has a real repository underneath — you've drawn a second rectangle that happens to say the same words. Nothing connects them. A change to one is invisible to the other by construction, not by accident.
This is what pushes teams toward the two bad options everyone recognizes: either maintain one "master" diagram and let every other view of the same information quietly rot, or accept that four diagrams means four maintenance jobs and budget the time for all four, forever. Neither is really a choice — it's a tax that diagram-first tooling imposes on anyone who needs to speak to more than one audience about the same system.
A model-native tool removes the tax by changing what a diagram actually is. Instead of being a canvas full of shapes, a diagram — a view, in this vocabulary — is a rendered result of a question asked against the model: which elements, which relationships, at what level of detail, styled how. Ask the same underlying model four different questions and you get four different pictures, correctly, every time, without ever creating a second copy of "Fraud Engine" to do it.
A view is a query, not a copy
The mechanical difference is worth being precise about, because it's the whole idea. A copy is a new object that starts identical to the original and diverges the moment either one changes without the other knowing. A query is a live selection over data that already exists — run it again and it reflects whatever the data currently says. Views without duplication means every diagram in the tool is closer to the second kind than the first.
Concretely, a view definition holds three kinds of information, and only one of them is unique to that view:
- Selection criteria — which elements and relationships from the model belong in this picture. This can be an explicit, curated list an architect assembled by hand, or a derived rule such as "everything tagged Tier-1" or "everything within two hops of the Payment API."
- Presentation — layout positions, which labels are visible, color-coding rules, grouping boxes, which relationship types are drawn versus suppressed. This is genuinely per-view and is supposed to differ from one diagram to the next.
- The elements and relationships themselves — their identity, their properties, their connections to everything else. This is never per-view. It lives once, in the model, and every view that references an element is pointing at the same underlying object.
The distinction between the second and third bullet is where most of the value sits. Two views are allowed to disagree about how something looks — one might show "Fraud Engine" as a plain box, another might color it red because a rule flagged it as non-compliant, a third might hide its label entirely to reduce clutter on a high-level slide. None of that is duplication, because none of it touches the underlying fact of what Fraud Engine is, what it does, or what it's connected to. What a model-native tool refuses to allow is two views disagreeing about whether Fraud Engine talks to the Ledger database — because that isn't a presentation choice, it's a fact, and facts exist exactly once.
Explicit membership versus derived queries
In practice, teams use both mechanisms, and it's worth being clear-eyed about the trade-off rather than pretending one is strictly better. An explicit view — an architect hand-picks which elements belong, the way you'd curate slides for a steering committee — gives full control over what a specific audience sees and in what order, at the cost of needing a human decision every time something new should join it. A derived view — defined by a filter, such as "everything in the Payments domain" or "everything within two hops of the Identity Service" — updates itself automatically as the model grows, at the cost of occasionally including something the architect wouldn't have chosen to show a particular audience, or growing cluttered as the model does.
Neither is duplication. Both are queries; they just differ in whether the query is "this specific list" or "this filter, evaluated now." The distinction matters because it's common to assume a curated, hand-arranged diagram must be a one-off copy divorced from the model — that intuition comes from diagram-first tools, where a hand-arranged diagram genuinely is disconnected. In a model-native tool, a curated view is still backed by real references to real elements; what's curated is only the membership list and the layout, not the elements' underlying identity or data.
A worked example: one payments platform, four audiences
Take a small, realistic slice of a payments platform: a Payment API, a Fraud Engine, a Ledger database, a Customer App, an Identity Service, and an external Card Processor the organization doesn't control. The Payment API talks to the Fraud Engine and the Ledger; the Fraud Engine talks to the Identity Service for risk signals; the Customer App calls the Payment API; the Payment API calls out to the Card Processor. Six elements, five relationships, modelled once.
Four stakeholders want four different pictures of this, and in most organizations those four pictures are drawn, stored, and maintained separately:
| Audience | What they need to see | How the view is defined |
|---|---|---|
| Steering committee | A simple, uncluttered landscape — five or six boxes, no internal wiring | Explicit membership, manually laid out, internal relationships hidden |
| Security reviewer | Everything that crosses a trust boundary, and nothing that doesn't | Derived: elements tagged public or external, plus their direct relationships |
| Integration architect | Every API, its protocol, and its consumers | Derived: elements of type "service" or "API", with protocol shown as a relationship property |
| Data protection officer | Everything that touches personal data, regardless of layer | Derived: elements or relationships tagged pii = true |
Now suppose the Fraud Engine gains a new dependency: a Sanctions Screening service, added because a new regulatory requirement means every transaction has to be checked against a sanctions list before the Fraud Engine clears it. In a diagram-first world, this is four separate editing sessions — find the landscape diagram, add a box, redraw; find the security diagram, decide whether Sanctions Screening counts as external (it does, it's a third-party feed), add it there too; find the integration diagram, add the new API call; the DPO's diagram probably gets missed because whoever added the dependency didn't think to check whether Sanctions Screening handles personal data (it does — it's screening people's names).
In a model-native tool, adding Sanctions Screening and its relationship to the Fraud Engine is one change to the model. The security view and the integration view — both derived, both filtered by criteria the new element happens to match — pick it up automatically the next time they're rendered, with no separate editing step. The DPO view picks it up too, but only once someone tags the relationship as pii-relevant — which is the correct behavior, not a gap: the view can't know a fact nobody has recorded, but once it's recorded once, it's visible everywhere it should be, including in a view nobody thought to update by hand. The steering committee's explicit view doesn't change at all, because nobody added Sanctions Screening to that curated list — which is also correct, since a compliance-plumbing detail usually doesn't belong on an executive slide. The tool didn't decide that for them; their earlier curation choice simply held.
Views under version control
Because a view is really a query plus a small amount of presentation, what actually gets stored for it is remarkably small: the criteria, the layout, and a set of references to elements that live elsewhere. A view definition contains no diagram in the drawing-tool sense — no duplicated element data, nothing that could drift out of sync with the model it describes, because it doesn't restate the model at all. It states a question. The canvas renders the answer.
That smallness has a consequence well beyond storage efficiency. Because the model and its views serialize deterministically — canonical ordering, stable element identifiers, the same model always producing byte-identical output — the whole thing sits comfortably in Git alongside everything else a team versions. Adding Sanctions Screening to the model and widening the integration view's criteria to take in the new external feed becomes a commit inside a pull request, with a diff a reviewer can actually read: two new elements, one new relationship, one changed filter. Compare that with a screenshot pasted into a wiki page, which carries no history beyond "someone replaced the image at some point," and offers no way to answer the question a reviewer actually has, which is what changed rather than what it looks like now.
The determinism is the part that's easy to underrate. A serialization that reorders elements on every save, or writes properties in whatever order the last client happened to iterate them, produces diffs that are ninety percent noise — and a reviewer who has been trained by three noisy diffs to skim the fourth has stopped reviewing anything. Stable ordering means the diff shows the change that was made and nothing else, which is the difference between architecture review being a real gate and being a formality with a green checkmark on it. It also makes a semantic diff possible on top of the raw one: "the Fraud Engine gained an outbound dependency on an external service" is a statement a reviewer can evaluate against policy in seconds, where a list of changed lines still has to be read and interpreted first.
Both edit modes converge on that same stored definition. Drag a box onto a curated view on the canvas and the view's membership list gains a reference and its layout gains a position — the commit that follows says exactly that and nothing more. Ask an AI assistant to assemble a view for a specific audience — "show me everything a security reviewer needs for the payments platform" — and it proposes the same kind of structured definition as a reviewable patch, which passes through exactly the same validation a hand-arranged view does before anything is applied. Neither mode has a privileged path into the model, and neither can produce a view the other couldn't have produced. That symmetry is what keeps the two from quietly becoming different dialects of the same tool, where some views are second-class because of how they happened to be made.
Round-tripping views with Archi and Sparx EA
This isn't an unfamiliar idea to anyone who has worked seriously in Sparx Enterprise Architect. EA's repository already lets one model element appear as a diagram object on several different diagrams — that's the entire basis of its "reusable element" behavior, and any architect who has right-clicked an element and chosen "Insert Related Elements" onto a second diagram has already been using views without duplication, just without that name for it. Archi's model tree versus its views works the same way: a folder of elements, and separate diagrams that place references to them.
The practical question when interoperating with either tool is whether round-tripping respects that structure or flattens it. Import an EA model that has three diagrams referencing an overlapping set of elements, and the risk is a naive importer either merges the three diagrams into one (losing the audience-specific framing each one had) or, worse, treats each diagram's copy of an element as a separate object (recreating the duplication problem the exchange was supposed to avoid). A model-native exchange format needs to preserve both: one canonical element, several view memberships, and — critically — per-diagram geometry, since EA and Archi both store where a shape sits on each specific diagram, and that's exactly the kind of native metadata a round-trip should carry through untouched even though the receiving tool doesn't need it to determine meaning. The same discipline applies on export: pushing a view back out to EA should produce a proper EA diagram object with its own GUID, not a flattened dump that loses which of several views a given layout belonged to.
Where this earns its keep is the case that trips up naive importers most often: an element referenced on a diagram that was deleted from the model's element list but never removed from the diagram — a common state in older EA repositories after years of restructuring. Treating the model, not the diagram, as the source of truth means the import can flag that orphaned reference rather than silently resurrecting a dead element or silently dropping a diagram shape without saying why.
Governance you get almost for free
Once views are queries over a real model rather than independent drawings, a few governance checks become close to automatic, because they're really just further queries.
Orphaned elements. An element that exists in the model but appears in zero views is invisible to everyone — nobody reviewing diagrams will ever see it, even though it's real, tagged, and connected to other things. This is a common byproduct of exactly the Sanctions Screening scenario above, run in reverse: someone adds an element while building out a detailed integration view, and it never makes it into any broader landscape. A lint pass that flags elements with zero view memberships turns "nobody would ever notice this" into a specific, actionable list.
Views that never get re-evaluated. A derived view's whole value is that it stays current automatically, but a team can still misuse one by treating its output as a fixed picture — exporting it once as an image for a document and never regenerating it. That's not a modelling problem the tool can fully prevent, but it's a reason to prefer publishing views as live links or regenerated exports on a cadence, rather than as static screenshots that quietly become exactly the kind of stale documentation views-without-duplication exists to avoid.
Ephemeral, throwaway views for a single question. Not every view needs to be a durable, named artifact. "Show me everything upstream of the Ledger database" or "highlight every element that violates the no-direct-database-access rule" are legitimate one-off queries — the same mechanism that produces a named, curated view for a steering committee can produce a disposable one to answer a single impact-analysis question, then be thrown away without leaving behind a diagram someone has to remember to delete later. Treating an ad hoc query and a permanent, named view as the same underlying mechanism, just with different lifespans, avoids a subtle failure mode: teams accumulating dozens of one-off diagrams from past investigations that nobody labelled as temporary and nobody now dares delete.
Honest objections
"Doesn't this limit expressive freedom — sometimes I want a diagram that isn't quite the model?"
Sometimes, yes — a target-state sketch for a workshop, a deliberately simplified "someday" architecture that doesn't reflect anything built yet. The honest answer is that this kind of diagram shouldn't be a view of the current model at all, because it isn't describing the current model; it's describing a proposal. The better home for it is either a genuinely separate draft — elements explicitly marked speculative or scoped to a "to-be" version, so the model says plainly that they don't exist yet — or a plain slide, built outside the tool, for the one meeting where a slightly fictionalized picture is the point. Views without duplication is a promise about diagrams that claim to represent reality. It was never meant to stop someone from drawing a napkin sketch of an idea; it's meant to stop a napkin sketch from being mistaken for documentation six months later.
"Doesn't maintaining view definitions become its own burden?"
To some degree, yes, and it's worth saying so rather than pretending queries are free. A badly written derived view — criteria too broad, matching half the portfolio — is exactly as useless as a cluttered hand-drawn diagram, just cluttered for a different reason. The practical answer teams tend to land on is to keep a small number of broad, durable derived views (a landscape view, a per-domain map, a security-exposure view) actively maintained and reviewed, treat curated executive views as deliberately narrow and hand-tended, and let anything narrower than that — a single impact-analysis question, a one-off investigation — stay ephemeral rather than being promoted to a named, permanent view it doesn't need to be.
"What about presentation polish — don't executives want something better than an auto-laid-out graph?"
They do, and views support that fully: manual positioning, custom colors and icons, hidden labels, grouping boxes drawn around a cluster of elements for visual clarity — all of it is legitimate per-view presentation, stored with that view and nowhere else. What isn't supported, by design, is two views disagreeing about a fact. An executive view is allowed to look completely different from a security view of the same elements. It isn't allowed to imply a dependency exists that the model says doesn't, or vice versa — because at that point it's stopped being a view of the architecture and started being a picture that merely resembles one.
"Does this scale? What about a model with thousands of elements and dozens of views?"
This is where the query model pays for itself rather than costing more. Because a view never stores a second copy of an element, adding a fiftieth view to a large model doesn't multiply storage the way fifty independently maintained diagrams would — each additional view is just another set of filter criteria and a layout, evaluated against the same underlying graph. The computational cost of rendering a view scales with how large that specific view's result set is, not with how large the whole model has grown, which is why heavy filtering and derived queries matter more, not less, as a portfolio grows. Keeping that evaluation fast in the browser rather than round-tripping to a server on every filter change is part of why Mooodels leans on browser-side computation with a minimal server footprint — a view re-query should feel like scrolling a list, not like waiting for a report to regenerate.
A short checklist for spotting real views versus disguised copies
A handful of quick tests tend to separate genuine views-without-duplication from a tool that just looks like it, regardless of vendor:
- Add an element in one place. Does it become available to every view whose criteria match it, or does it need to be manually re-added to each diagram separately?
- Move a box on one diagram. Does anything change on a second diagram showing the same element, or does presentation stay properly local to the view you touched?
- Delete an element from the model. Does every view that referenced it drop the reference cleanly, or are there orphaned shapes left behind that still point at nothing?
- Duplicate a diagram to tweak it for a new audience. Do the two diagrams still share identity with the underlying elements, or have you just forked two independent drawings that will now drift apart?
- Ask the tool which elements exist but appear in no diagram at all. Is that a query it can answer, or a question nobody can answer without opening every diagram by hand?
A tool that handles all five is treating a diagram as what it actually is: a view, not a place where data lives. A tool that struggles with more than one or two is still, underneath the polish, asking you to keep several pictures of the same thing in sync by hand — which is the exact job architects have been quietly doing for free, and getting quietly blamed for when it slips, for as long as diagramming tools have existed.
Where this leaves the diagram
None of this makes the diagram less important — if anything, it makes diagrams more trustworthy, because a diagram in a model-native tool is guaranteed to be showing something that's actually true right now, not something that was true when it was last redrawn. What changes is the diagram's job description. It stops being the place where architectural facts are recorded, and becomes what it was always meant to be: a specific, audience-shaped answer to the question "show me this part of the architecture," generated on demand from a model that only has to be told each fact once.
That's a small mechanical shift with a large practical consequence. The steering committee, the security reviewer, the integration architect, and the DPO can each get a diagram built for them specifically, without anyone accepting the old trade-off between "one true diagram everyone has to squint at" and "four diagrams, four maintenance jobs, and a slow drift toward four different stories about the same system."
See the model this article describes, working in a real editor.
Try the live demo