CREATE TABLE persons (
    id BIGINT NOT NULL PRIMARY KEY,
    first_name TEXT NOT NULL,
    last_name TEXT NOT NULL
);

CREATE TABLE instruments (
    id BIGINT NOT NULL PRIMARY KEY,
    name TEXT NOT NULL
);

CREATE TABLE works (
    id BIGINT NOT NULL PRIMARY KEY,
    composer BIGINT NOT NULL REFERENCES persons(id),
    title TEXT NOT NULL
);

CREATE TABLE instrumentations (
    id BIGINT NOT NULL PRIMARY KEY,
    work BIGINT NOT NULL REFERENCES works(id) ON DELETE CASCADE,
    instrument BIGINT NOT NULL REFERENCES instruments(id)
);

CREATE TABLE work_parts (
    id BIGINT NOT NULL PRIMARY KEY,
    work BIGINT NOT NULL REFERENCES works(id) ON DELETE CASCADE,
    part_index BIGINT NOT NULL,
    composer BIGINT REFERENCES persons(id),
    title TEXT NOT NULL
);

CREATE TABLE part_instrumentations (
    id BIGINT NOT NULL PRIMARY KEY,
    work_part BIGINT NOT NULL REFERENCES works(id) ON DELETE CASCADE,
    instrument BIGINT NOT NULL REFERENCES instruments(id)
);

CREATE TABLE work_sections (
    id BIGINT NOT NULL PRIMARY KEY,
    work BIGINT NOT NULL REFERENCES works(id) ON DELETE CASCADE,
    title TEXT NOT NULL,
    before_index BIGINT NOT NULL
);

CREATE TABLE ensembles (
    id BIGINT NOT NULL PRIMARY KEY,
    name TEXT NOT NULL
);

CREATE TABLE recordings (
    id BIGINT NOT NULL PRIMARY KEY,
    work BIGINT NOT NULL REFERENCES works(id),
    comment TEXT NOT NULL
);

CREATE TABLE performances (
    id BIGINT NOT NULL PRIMARY KEY,
    recording BIGINT NOT NULL REFERENCES recordings(id) ON DELETE CASCADE,
    person BIGINT REFERENCES persons(id),
    ensemble BIGINT REFERENCES ensembles(id),
    role BIGINT REFERENCES instruments(id)
);

CREATE TABLE tracks (
    id BIGINT NOT NULL PRIMARY KEY,
    file_name TEXT NOT NULL,
    recording BIGINT NOT NULL REFERENCES recordings(id),
    track_index INTEGER NOT NULL,
    work_parts TEXT NOT NULL
);