RxNorm vs. NDC
RxNorm and NDC are the two most widely used drug identifiers in U.S. healthcare data — but they identify different things. RxNorm identifies what a drug is (ingredient, form, strength). NDC identifies which package of that drug was dispensed. Understanding the distinction is essential for anyone working with pharmacy claims, EHR data, or drug pricing.
RxNorm
NDC
Side-by-Side Comparison
The following table compares RxNorm and NDC across the dimensions that matter most for data engineering and analytics.
| Dimension | RxNorm | NDC |
|---|---|---|
| Full name | RxNorm (NLM Clinical Drug Nomenclature) | National Drug Code |
| Maintained by | NLM / NIH | FDA |
| Identifier | RXCUI (integer) | NDC (10- or 11-digit string) |
| What it identifies | A clinical drug concept (ingredient + form + strength) | A specific drug package (labeler + product + package) |
| Granularity | Drug concept level — one RXCUI covers all package sizes from all manufacturers of the same generic | Package level — each manufacturer, package size, and formulation gets a unique NDC |
| Hierarchy | Yes — IN → SCDF → SCD/SBD with explicit parent–child relationships | Flat — NDC segments (labeler, product, package) are encoded in the code itself but there is no formal hierarchy |
| Stability | Stable — RXCUIs are never reused for a different concept | Unstable — NDCs can be reassigned to different drugs after 10 years |
| Typical cardinality | ~115K active concepts | ~300K+ active codes |
| Update cadence | Weekly (NLM RxNorm release) | Continuous (FDA NDC Directory) |
| Primary use | Clinical interoperability, EHR, e-prescribing, drug analytics | Pharmacy dispensing, claims adjudication, inventory |
The Many-to-One Relationship
Multiple NDCs map to a single RXCUI. This is the key structural relationship between the two systems. Every generic manufacturer, every package size, and every labeler-specific product gets its own NDC — but they all roll up to the same RxNorm concept if the drug, form, and strength are identical.
| NDC | Manufacturer / Package | RXCUI |
|---|---|---|
| 00071-0215-23 | Pfizer 30-count bottle | 617321 |
| 00378-3950-01 | Mylan 100-count bottle | 617314 |
| 00591-3750-01 | Actavis 100-count bottle | 617314 |
| 00071-0215-40 | Pfizer 90-count bottle | 617321 |
Four different NDCs (two manufacturers, two package sizes) map to just two RXCUIs — one generic (SCD) and one branded (SBD).
When to Use Which
Use NDC when…
- Processing pharmacy claims (NDC is the dispensing-level identifier on every claim)
- Matching to NADAC or other NDC-level pricing benchmarks
- Tracking specific manufacturers, package sizes, or labelers
- Working with FDA drug listing or recall data
Use RxNorm when…
- Aggregating utilization or spend across manufacturers and package sizes
- Joining clinical data (EHR, e-prescribing) to claims data
- Building drug hierarchies (roll up from product → ingredient)
- Mapping drugs to enrichment layers like ICD-10 indications or ATC classes
Mapping Between Them: The NDC–RxNorm Crosswalk
In practice, most analytics workflows need both identifiers. Claims arrive with NDCs; enrichment layers are keyed on RXCUIs. The bridge is a crosswalk table that maps each NDC to its corresponding RXCUI.
Example — join claims NDC to RxNorm drug hierarchy
SELECT
c.ndc,
n.drug_id,
d.drug_name,
d.ingredient,
c.total_amount_reimbursed
FROM claims c
JOIN ndc_rxnorm n ON n.ndc11 = c.ndc
JOIN rxnorm.drug_detail d ON d.drug_id = n.drug_id;The crosswalk handles NDC normalization (10→11 digit conversion, zero-padding) and resolves each NDC to the correct SCD or SBD concept. For a detailed walkthrough, see the RxNorm–NDC Crosswalk and NDC Normalization Guide.
How TwinFyRx bridges RxNorm and NDC
TwinFyRx maintains a normalized ndc_rxnorm crosswalk updated weekly from the NLM RxNorm release. Every NDC is resolved to an 11-digit form and mapped to a drug_id (SCD/SBD RXCUI), which serves as the primary key across all enrichment layers — pricing, indications, therapy attributes, and suspecting rules.