Data contract (single table) Table name: isotopes_master


columntypenotes
element_zINTatomic number (1–118)
element_symbolTEXT(3)“H”, “He”, …
element_labelTEXT“H (1)” exactly as in files
known_isotopesINTexperimentally observed, strict stable definition applied elsewhere
stable_isotopes_strictINTstrict IUPAC stable count
unstable_isotopesINTcomputed = known − stable
predicted_isotopes_estINTNeufcourt-scaled total (sums to 7,759)
gap_pred_minus_knownINTpredicted − known

If you prefer a normalized model, split “known”, “predicted” and “metadata” into separate tables keyed by element_z.


SQL DDL (Postgres / MySQL compatible):


CREATE TABLE isotopes_master (
element_z INT PRIMARY KEY,
element_symbol VARCHAR(3) NOT NULL,
element_label VARCHAR(16) NOT NULL,
known_isotopes INT NOT NULL,
stable_isotopes_strict INT NOT NULL,
unstable_isotopes INT NOT NULL,
predicted_isotopes_est INT NOT NULL,
gap_pred_minus_known INT NOT NULL
);

Upsert loader (Postgres):


-- assuming a temp staging table or CSV loader
-- columns in CSV: Element (Z), Isotopes Known, Stable, Unstable, Predicted Isotopes (est.), Gap (Predicted - Known)
-- element_symbol is parsed from Element (Z) token before the space
-- element_z is parsed from inside parentheses

-- Example: programmatic load recommended (see ETL note below)

ETL note: parse element_symbol and element_z from element_label (“Fe (26)”) in your loader. If you want, I can generate a clean JSON with explicit element_z and element_symbol columns.