Every estate that joins building data to anything else arrives at the same decision, usually without noticing it was a decision. The BMS has point names, the maintenance system has asset codes, the analytics layer has series identifiers, and something has to tie them together. The point name is right there, it is human-readable, and it already encodes the site, the plant and the measurement. So it becomes the key. Two years later somebody corrects a typo in a point name and a dashboard loses a year of history.
The message up front: join on a stable surrogate identifier that carries no meaning, and treat every name, including the BMS name, as an attribute of that identifier rather than as the identifier itself. Hold the crosswalk in one place that is owned, versioned and queryable. Expect names to be inconsistent across sites and do not try to fix that before you can join; a crosswalk accommodates inconsistency, whereas a naming standard requires everyone to have agreed years ago.
1. Why names fail as keys
The argument for names is real: they are already there, they are readable, and they usually encode useful structure. The argument against is that none of those properties is stability.
- Names get corrected. A typo, a wrong plant reference, a unit in the wrong place. Each correction is an improvement to the BMS and a broken join everywhere else.
- Names get restructured. A new naming convention adopted at one site, or applied during a head-end upgrade, renames everything at once.
- Names are not unique in the way you need. They are usually unique within a controller or a site and routinely collide across an estate, so the real key is the name plus a scope that is often implicit.
- Names encode things that change. A name containing a room number stops being true when the space is re-partitioned, and a name containing a tenant stops being true when the tenant leaves.
- Names are inconsistent between systems by construction. The maintenance system's asset code was created by a different team at a different time for a different purpose, and expecting the two to align is expecting a coincidence.
None of this is an argument against good naming. Readable, consistent names are genuinely valuable for the people operating the system. They are just not a key.
2. The surrogate identifier and what hangs off it
The fix is unexciting and durable: mint an identifier that means nothing, assign it once per logical point, and attach everything else to it as attributes.
| Attribute | Role | Changes? |
|---|---|---|
| Surrogate identifier | The join key, meaningless by design | Never. That is its only requirement |
| Protocol address | Device and object reference used to collect the value | Yes, on controller replacement or re-addressing |
| BMS point name | What operators see in the head end | Yes, and it should be allowed to |
| Asset reference | The asset in the maintenance system | Yes, on re-hierarchy or asset replacement |
| Analytics series identifier | How the time-series store names it | Yes, on platform migration |
| Measurement semantics | What is measured, in what unit, as rate or quantity | Rarely, and a change here is significant, per units and scaling |
| Validity period | When this set of attributes applied | By definition. This is what makes history interpretable |
Every row in that table except the first is expected to change, which is precisely why none of them can be the key. The register that holds this is the one described in the BMS point dictionary; what this adds is the discipline that the identifier is separate from every description of the thing.
Resist the meaningful identifier
There will be strong pressure to make the identifier readable, because an opaque key is inconvenient when somebody is reading a table or debugging a feed. Encoding the site, system and measurement into it feels like free documentation. It is not free: the moment any encoded fact changes, you face a choice between an identifier that lies and a rename that breaks the joins, which is the problem you built the identifier to avoid. Keep it opaque and solve readability by joining the name in wherever a human will look. The inconvenience is small, repeated and easily automated; the alternative is a migration.
3. One crosswalk, owned
The second structural decision is where the crosswalk lives, and the answer is one place rather than wherever each integration needed it.
The usual state is three partial crosswalks: one embedded in the integration configuration, one in a spreadsheet maintained by whoever did the analytics work, and one implied by naming conventions in the historian. They disagree, and because each is used by a different consumer, the disagreements show up as inconsistent numbers rather than as errors.
- Hold it in a queryable store, not a document. Integrations need to read it at runtime, which a spreadsheet cannot support.
- Give it one owner. Usually whoever owns the integration layer. A shared crosswalk with no owner diverges immediately.
- Version it, with effective dates. A mapping corrected today changes the meaning of history, so the previous mapping has to remain recoverable for the same reason set out in alarm code mapping.
- Include it in the backup inventory. It is the thing that makes everything else interpretable and it is routinely excluded, per backup and restore testing.
4. Building the crosswalk on an existing estate
Nobody starts clean. The practical question is how to construct a crosswalk across systems whose names were never designed to align.
- Use name matching to generate candidates, never to commit. Fuzzy matching on names is a good way to produce a list to review and a terrible way to populate a production mapping, because a confident wrong match is worse than no match.
- Confirm against location and plant structure. A candidate match whose asset is in a different building is wrong regardless of how well the names agree.
- Verify a sample physically. The only genuine confirmation that a point belongs to an asset is somebody checking, which is the argument in point-to-asset mapping.
- Record confidence on each row. A mapping marked as unverified that later produces a surprising result can be investigated; an unmarked one cannot be distinguished from a verified one.
- Work in criticality order and stop. Complete coverage is not the goal. Coverage of the points that feed decisions is, and the rest can be driven by the unmapped report.
5. The identity cases that are genuinely hard
Three situations resist a simple one-to-one crosswalk and need a decision rather than a lookup.
The same quantity measured twice. A value available both from a controller and from a separate metering system is two points measuring one thing, and they will not agree exactly. Mapping both to one logical point produces duplicates, as in duplicate sensor readings; keeping them separate means consumers must know which to use. The workable answer is to keep both with a designated primary, and to record the relationship so the discrepancy is a known fact rather than a recurring discovery.
One point serving several assets. A shared supply temperature or a common meter genuinely relates to multiple assets, and forcing a single asset reference loses that. This needs a many-to-many relationship with the role stated, not a choice.
The point that moved. A sensor relocated to different plant is the same device and a different logical point, which means the old identifier's validity ends and a new one begins. Treating it as a continuous series silently joins two different things, which is the discontinuity problem in sensor replacement and BMS history.
6. Detecting drift before it breaks something
A crosswalk degrades quietly, because nothing fails when it goes wrong. The queries that catch it are cheap and worth scheduling.
- Mapped points that have stopped reporting. Either the point was removed or the address changed, and both need the mapping updated rather than left pointing at nothing.
- Reporting points with no mapping. Something was added. This is the count that should be reviewed rather than ignored.
- Mappings whose asset no longer exists, usually after a hierarchy change in the maintenance system.
- Name changes on mapped points. Not an error, but worth seeing, because a renamed point is sometimes a repurposed one.
- Duplicate asset references where you expect one. Two points claiming to be the same measurement on the same asset is either a real duplicate or a mapping error, and both need resolving.
These fit naturally alongside the pipeline checks in ingestion monitoring, and they are the mechanism that keeps the crosswalk from becoming the stale spreadsheet it replaced.
Limits
No naming convention is proposed here and no tagging standard is endorsed, partly because several exist and the choice depends on the tooling you already have, and partly because the argument above is that a crosswalk is what lets you join without first agreeing a convention. Nothing here addresses how a control strategy should name or structure its points, which is the controls engineer's decision and may be constrained by the product. No judgement is offered on which of two disagreeing measurements of the same quantity is correct; that requires calibration and physical verification by somebody qualified. This is written from the integration and data side.
The idea to walk away with
Joining building data across systems fails on identity, and it fails because the obvious key is a description. Names are corrected, restructured, reused and inconsistent between systems, and every one of those is a normal event rather than a fault.
Mint a meaningless identifier per logical point, hang every name and address off it as a dated attribute, keep one owned and versioned crosswalk that integrations read at runtime, build it in criticality order with confidence recorded, and schedule the few queries that detect drift.
Final thoughts
A single question tells you where you stand: if a point in your BMS were renamed tomorrow, what would break.
If the answer is nothing, your identity model is sound. If the answer is a dashboard, a report and an integration, then the surrogate identifier is the smallest change that removes a whole class of future outages, and it is far easier to introduce before the next head-end upgrade renames everything at once.
Disclosure
Alongside advisory work I also build a CMMS and CAFM platform, so I have a commercial interest in this category. Nothing above is a recommendation for it, and no vendor named here has paid for inclusion or had any editorial input. Weigh the analysis accordingly.
Joining on point names?
Independent help introducing stable identifiers, consolidating three partial crosswalks into one owned register, and detecting drift before it breaks a report. 22+ years across CMMS, CAFM, EAM and ERP implementations.
Book a conversationRelated reading: BMS point dictionary, Point-to-asset mapping, Duplicate sensor readings, Migrating point history, Linking faults to asset history, Ingestion monitoring.
Muhammad Abbas
CMMS / CAFM Manager & Independent Advisor · 22+ years across enterprise CMMS, EAM, CAFM and ERP implementations in utilities, oil and gas, manufacturing, government and facility operations.
Work with me