Skip to content
Zowork
All case studies
Engineering deep-divePlatform study · Caché®~13 min read

The database that stores a patient record as a path, not a join.

InterSystems Caché is a high-performance, multi-model database: object, relational and multidimensional at once. Under the hood it keeps data in hierarchical globals you address directly instead of searching, which is exactly why it sits beneath some of the most demanding systems in healthcare. We spent years engineering on it, inside a high-volume behavioral-health EHR.

InterSystems CachéMUMPSObjectScriptHealthcareInteroperability
multidimensional storage^Patient
ObjectScript · global set
SET ^Patient(1001,"Demographics","Name")= "Riley Carter"
SET ^Patient(1001,"Demographics","DOB")= "1986-04-12"
SET ^Patient(1001,"Clinical","Assessment")= 14
SET ^Patient(1001,"Billing","Claims")= "90837"
Hierarchical global
^Patient(1001)
Demographics
Name
DOB
Clinical
Assessment
Billing
Claims
direct addressed write · no joins
Introduction

A database that doesn't look like a database

InterSystems Caché combines database management, application development and integration in a single platform. It speaks three data models (relational, object-oriented and multidimensional) over one physical store, so a team can model entities as objects, query them in SQL, and still get the raw speed of direct multidimensional access.

That combination is why it shows up in healthcare, banking, government and telecom: places where transactions are high-volume, latency is felt by a human waiting, and downtime isn’t an option. InterSystems has built data software since 1978; Caché became the platform of record for organisations that needed performance without giving up developer productivity.

Healthcare
Banking
Government
Telecom
The problem

Healthcare data, at the speed care needs it

A behavioral-health provider generates an enormous amount of data every day: demographics, diagnoses, treatment plans, assessments, medications, lab results, authorisations and claims. A clinician needs the right slice of it instantly.

  • Manage large volumes of structured and unstructured clinical data.
  • Keep transaction processing fast while thousands of records change at once.
  • Integrate data across departments and outside systems without building a silo per source.
  • Stay available and consistent, because a few seconds’ delay can change a clinical decision.

Traditional relational databases can stall here: complex, high-volume workloads turn into multi-table joins and repeated disk seeks. Caché takes a different route to the same data.

The platform

One platform, cleanly layered

Applications talk to business logic; logic reaches data through either an object or a SQL lens; both resolve to a single multidimensional engine that owns physical storage. A request travels down and a response travels back up the same spine.

User applications
Web · mobile · enterprise systems
Business logic
Objects, classes & application services
SQL engine · object access
Relational and object views of one store
Multidimensional enginecore
Hierarchical globals at the core
Physical storage
Disk · backup · recovery
The core idea

Why multidimensional beats joins

A relational read fans out across tables and joins them back together. A Caché read walks a known path straight to the value. Same data, far fewer moving parts.

Traditional relational
multi-join
Application
SQL
query planner
joins across tables
PatientVisitBilling
Storage
InterSystems Caché
direct read
Application
Object access / SQL
one store, two views
Multidimensional engine
addressed, not searched
Storage

Data lives in globals: persistent, hierarchical arrays where the subscripts are the index. There is no separate table to define and no row to look up; the address you write is the address you read. Globals are sparse, so only the nodes that exist consume space, and deeply nested clinical structures come back without a single join.

patient.global.mac
objectscript
1; In Caché a patient record IS its access path. No table, no row id,2; and no join: the subscripts ARE the index. Sparse by nature, so only3; the nodes that exist take any space.4SET ^Patient(1001,"Demographics","Name") = "Riley Carter"5SET ^Patient(1001,"Demographics","DOB")  = "1986-04-12"6SET ^Patient(1001,"Clinical","Assessment","PHQ9") = 147SET ^Patient(1001,"Billing","Claims",claimId) = $LISTBUILD(code, units, auth)8 9; Reading is direct addressing: walk the path, not a query plan.10WRITE ^Patient(1001,"Clinical","Assessment","PHQ9")   ; -> 14
FeatureWhat it buys you
Multidimensional storageDirect, sparse access with no joins to read a full record
Object + SQL on one storeModel in objects, query in SQL, no second copy of the data
ObjectScriptMUMPS-class speed with classes, inheritance and exceptions
High availabilityMirroring and shadowing keep downtime low
ScalabilityGrows with users and data without a redesign
Built-in securityRow- and role-level controls over sensitive records
The foundation

MUMPS isn't legacy, it's the engine's heart

MUMPS (the M language, born in a hospital in 1966) introduced global variables and a multidimensional data model. Caché didn't replace that; it grew from it, adding indexing, transactions, security, objects and SQL on top.

MUMPS · the M language
1966, built for healthcare
Global variables
persistent
Multidimensional storage
hierarchical
InterSystems Caché engine
indexing · transactions · security
ObjectScript
OOP extensions
SQL access
relational
Enterprise applications
healthcare · banking · government

Understanding MUMPS pays off precisely because so much of Caché’s behaviour, and so much production healthcare code, still rests on globals. ObjectScript is the modern extension: it keeps M’s syntax and speed while adding classes, methods, properties, exception handling and SQL. The same record can be a global, an object and a SQL row.

SolutionApp.Patient.cls
objectscript
1/// The same data the global holds, now an object you can model,2/// inherit and validate, and that the SQL engine can also query.3Class App.Patient Extends %Persistent4{5  Property Name As %String(MAXLEN = 120) [ Required ];6  Property DOB  As %Date;7 8  /// One declaration, two access paths: objects in code, rows in SQL.9  Index NameIdx On Name;10 11  ClassMethod Score(id As %Integer) As %Integer12  {13    Quit ^Patient(id, "Clinical", "Assessment", "PHQ9")14  }15}
Why it still matters
Treating MUMPS as “old” is the expensive mistake. Knowing how globals are laid out is what makes it possible to optimise access patterns, debug deep routines and extend decades-old logic safely. The performance everyone wants from Caché is inherited straight from M.
The work

What we engineered on Caché

Inside a large behavioral-health EHR (patient records, treatment planning, clinical documentation, billing, reporting and compliance), we worked across the backend and the platform around it.

Backend in MUMPS & ObjectScript

New features and fixes across legacy M routines and modern ObjectScript classes that drive core clinical workflows.

Electronic forms

Clinical capture forms with field-level validation that catches bad data at the point of entry, not after it lands.

Batch import automation

ObjectScript routines that turn structured config files into forms and system setup, so deployments take minutes, not days.

Web services & integration

Services that exchange data with hospitals, labs, pharmacies and payers so a record entered once is correct everywhere.

Reporting

Crystal Reports templates over Caché data for patient summaries, clinical documentation and compliance submissions.

Performance tuning

Better global access patterns, leaner queries and tighter transactions to keep clinical workflows responsive under load.

Clinical capture

Forms that refuse bad data at the door

Electronic forms are where clinicians actually enter assessments, diagnoses and treatment plans. We pushed validation to the point of entry (required fields, numeric ranges, cross-field dependencies and clinical rules), so the record is correct before it’s ever persisted to a global.

Clinical form field
PHQ-9 · total score
14/ 27checking
Required
Numeric range
Cross-field dependency
Clinical rule
awaiting validation

Each form composes sections, groups, fields, validation rules, calculated values and conditional logic. Rules run on the client and again on the server in ObjectScript, so a treatment-plan form can require a diagnosis before objectives are entered. Configurable forms let organisations change clinical workflows without an application code change, and validated values map cleanly into Caché’s multidimensional structures for fast retrieval.

Deployment

From config files to a configured system

Standing up a new organisation means importing large numbers of forms, assessment templates, lookup values and workflow rules. Doing that by hand is slow and error-prone, so we built a batch import framework in ObjectScript.

Config files
CSV / XML
Parse
ObjectScript
Validate
rules & integrity
Globals
persist
Forms live
deployed

The engine validated before committing anything (field dependencies, duplicate identifiers, data types, referential integrity and configuration hierarchy), then transformed valid input into object structures and persistent globals, tuned to minimise disk I/O. The result: consistent setup across deployments, in a fraction of the time.

Integration

One record, reflected everywhere

A modern healthcare ecosystem is many systems that must agree. Caché is built to be the integration point: it collects from hospitals, labs and payers, standardises it, and serves a single repository the rest of the platform reads from.

Source systems
Hospital A
Hospital B
Laboratories
Insurance systems
InterSystems Caché
standardize · integrate
Unified data repository
Reports & analytics

We built and maintained the web services that move data between the platform and external systems, so information entered in one place is reflected accurately across every connected system. Standardising into a unified repository is what makes comprehensive reporting and analytics possible, and what dissolves the data silos that slow care down.

Outcome

Why it holds up where care can't wait

1,966

The year MUMPS was created, and its model still powers the engine

six decades in production
0 joins

To read a full patient record from a global

direct addressing
3

Data models over one physical store: object, relational, multidimensional

no second copy
  • Faster retrieval of deeply nested records, with no joins to reassemble a patient.
  • Lower database overhead and high transaction throughput under real clinical load.
  • Interoperability that keeps records consistent across hospitals, labs and payers.
  • Reliability and availability that let clinicians trust the data is there when they reach for it.
Conclusion

Old roots, modern reach

Caché’s advantage is structural: store data the way you read it, and most of the work a relational database does on every query simply disappears. It asks for specialised knowledge (globals, ObjectScript, a smaller community than mainstream databases, real effort to migrate onto), but in return it delivers the speed, reliability and scale that mission-critical healthcare depends on. Knowing the platform from MUMPS up is what lets a team extend it safely instead of working around it.

Running on Caché, MUMPS or another platform everyone’s afraid to touch? We’re at home in the engine room as well as the front end.

Talk to engineering