Я использую базу данных Oracle. У меня есть система, скажем, строки. Не как в строке типа данных, но как в маленьких кусочках веревки.
Начало и конец строки могут меняться с годами. История этих изменений должна быть сохранена. Отчетность составляется ежегодно. Пользователь хочет увидеть, каким было начало и конец строки в 2016, 2017, 2018 и т. Д. c. Строка может меняться пару раз в год или только один раз в 2/3 года. Пользователь просто интересуется последними изменениями за указанный c год. Каково было действительное начало и конец 2016 или 2017 года и т. Д. c?
CREATE TABLE STRINGLIST
(
ID NUMBER,
STRINGID NUMBER,
STRING VARCHAR2(7 BYTE),
STRING_START NUMBER,
STRING_END NUMBER,
CREATE_DATE DATE,
CREATED_BY VARCHAR2(10 BYTE),
EXPIRE_DATE DATE,
EXPIRED_BY VARCHAR2(10 BYTE)
)
Insert into PMS2020.STRINGLIST
(ID, STRINGID, STRING, STRING_START, STRING_END,
CREATE_DATE, CREATED_BY, EXPIRE_DATE, EXPIRED_BY)
Values
(1, 1, 'string1', 0, 5,
TO_DATE('02/02/2015 12:31:00', 'MM/DD/YYYY HH24:MI:SS'), 'user1', TO_DATE('04/02/2016 12:31:00', 'MM/DD/YYYY HH24:MI:SS'), 'user1');
Insert into PMS2020.STRINGLIST
(ID, STRINGID, STRING, STRING_START, STRING_END,
CREATE_DATE, CREATED_BY, EXPIRE_DATE, EXPIRED_BY)
Values
(2, 1, 'string1', 0.1, 5,
TO_DATE('04/02/2016 12:31:00', 'MM/DD/YYYY HH24:MI:SS'), 'user1', TO_DATE('02/02/2016 12:31:00', 'MM/DD/YYYY HH24:MI:SS'), 'user1');
Insert into PMS2020.STRINGLIST
(ID, STRINGID, STRING, STRING_START, STRING_END,
CREATE_DATE, CREATED_BY, EXPIRE_DATE, EXPIRED_BY)
Values
(3, 1, 'string1', 0.12, 5.2,
TO_DATE('04/02/2016 12:31:00', 'MM/DD/YYYY HH24:MI:SS'), 'user1', TO_DATE('04/02/2018 12:31:00', 'MM/DD/YYYY HH24:MI:SS'), 'user1');
Insert into PMS2020.STRINGLIST
(ID, STRINGID, STRING, STRING_START, STRING_END,
CREATE_DATE, CREATED_BY, EXPIRE_DATE, EXPIRED_BY)
Values
(4, 1, 'string1', 0.5, 6,
TO_DATE('04/02/2018 12:32:00', 'MM/DD/YYYY HH24:MI:SS'), 'user1', TO_DATE('04/02/2019 12:32:00', 'MM/DD/YYYY HH24:MI:SS'), 'user1');
Insert into PMS2020.STRINGLIST
(ID, STRINGID, STRING, STRING_START, STRING_END,
CREATE_DATE, CREATED_BY)
Values
(5, 1, 'string1', 0.75, 6.5,
TO_DATE('04/02/2019 12:32:00', 'MM/DD/YYYY HH24:MI:SS'), 'user1');
COMMIT;

Текущий размер строки легко получить:
select *
from stringlist
where stringid = 1
and expiry_date is null;
Как будет выглядеть запрос, чтобы получить последний размер строки для:
2015 0,1 - 5
2016 0,12 - 5,2
2017 0,12 - 5,2 ( в 2017 году не было внесено никаких изменений, поэтому значение 2016 года остается в силе)
2018 0,5 - 6
2019 0,75 - 6,5
Пользователь должен будет просто выбрать тип Строка и год. И размер должен отображаться в отчете за выбранный год.
Очень простым способом будет просто добавить string_year. Таким образом, будет запись для каждой строки для каждого года. Но это даст вам дублирование на 2016 и 2017 годы, потому что в 2017 году ничего не изменилось.
Это, очевидно, очень простое c объяснение системы. «Строки» также имеют много различных атрибутов и т. Д. 1036 *. Но это не важно для этого вопроса.
Как вы справитесь с чем-то подобным? Каким будет ваш дизайн БД?