Мне нужно, чтобы название предприятия было таким же, как оно было при регистрации, а не его значение в настоящее время - PullRequest
0 голосов
/ 24 января 2019

Я объясню проблему на примере: Я разрабатываю конкретный случай ссылочной целостности в таблице. В модели есть две таблицы: предприятие и документ. Мы регистрируем компании, а затем кто-то вставляет документы, связанные с этим. Название предприятия является переменным. Когда дело доходит до восстановления документов, мне нужно, чтобы название предприятия было таким же, как оно было при регистрации, а не его значение в настоящее время. Я решил, что решением будет снова регистрировать компанию в каждом изменении с тем же кодом, обновленное имя таким образом даст ожидаемый результат, но я не уверен, что это лучшее решение. Может ли кто-нибудь сделать предложение? enter image description here

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Существует несколько возможных решений, и трудно определить, какое из них будет самым простым.

Дополнительный комментарий : ваш вопрос ограничен эффективным управлением именами, но я хотел бы прокомментировать тот факт, что ваша БД чувствительна к перемещению, переименованию или удалению файлов. Ваша база данных не сможет поддерживать записи в актуальном состоянии, если что-то случится на уровне ОС. Вам следует подумать и об этом.

Среди немногих решений, которые я рассмотрел, лучше всего подходит нормализованная схема ниже:

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 только «активное» имя, сделать нелегко.

0 голосов
/ 24 января 2019

Добавьте диапазон дат для вашего предприятия: valid_from, valid_to. Инициализировать в -infinity, + бесконечность Когда вы изменяете имя предприятия, вместо этого: обновите существующие строки, где valid_to = + бесконечность, чтобы быть now () и вставьте новое имя с valid_from = now (), valid_to = + infinity.

Добавить поле даты в документ, что-то вроде create_date. Затем при присоединении к предприятию вы присоединяетесь к ID и d.create_date между e.valid_from и e.valid_to.

Это упрощенный подход, который нарушает уникальность вашего идентификатора и кода. Чтобы справиться с этим, вы можете записать имя в отдельной таблице с идентификатором от, до, имя. Оставьте исходную таблицу с идентификатором и кодом только для уникальности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...