Существует несколько возможных решений, и трудно определить, какое из них будет самым простым.
Дополнительный комментарий : ваш вопрос ограничен эффективным управлением именами, но я хотел бы прокомментировать тот факт, что ваша БД чувствительна к перемещению, переименованию или удалению файлов. Ваша база данных не сможет поддерживать записи в актуальном состоянии, если что-то случится на уровне ОС. Вам следует подумать и об этом.
Среди немногих решений, которые я рассмотрел, лучше всего подходит нормализованная схема ниже:
CREATE TABLE Enterprise
(
IdEnterprise SERIAL PRIMARY KEY
, Code VARCHAR(4) UNIQUE
, IdName INTEGER DEFAULT -1 /* This will be used to get a single active name */
);
CREATE TABLE EnterpriseName (
IDName SERIAL PRIMARY KEY
, IdEnterprise INTEGER NOT NULL REFERENCES Enterprise(IdEnterprise) ON UPDATE NO ACTION ON DELETE CASCADE
, Name TEXT NOT NULL
);
ALTER TABLE Enterprise ADD FOREIGN KEY (IdName) REFERENCES EnterpriseName(IdName) ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED;
CREATE TABLE Document
(
IdDocument SERIAL PRIMARY KEY
, IdName INTEGER NOT NULL REFERENCES EnterpriseName(IDName) ON UPDATE NO ACTION ON DELETE NO ACTION
, FilePath TEXT NOT NULL
, Description TEXT
);
Использование флага и / или временных меток или перемещение названия предприятия в таблицу document
являются привлекательными решениями, но только на первый взгляд.
В частности, часть, в которой вы должны убедиться, что у компании всегда есть 1, а 1 только «активное» имя, сделать нелегко.