dimka, я не описывал "сотрудника и зарплату".
Ага
См.: история (включая текущее значение) хранится в СП2, в СП1 - статическая часть, история изменений которой не нужна.
Одна запись СП1 ссылается на одну строку СП2 через sp2_id - это текущее значение.
Выбрать всю историю изменений можно из СП2 по sp1_id.
Я это и имел ввиду, только вместо SP1.sp2_id использовать текущую дату.
Сравни:
select ODT.*, e.*, p.*
from ODT
inner join Employee e on e.eid = ODT.eid
inner join Paid p on p.eid = e.eid
where
p.begdate < @currentdate and
not exists(
select *
from Paid p1
where
p1.eid = e.eid and
p1.begdate > p.begdate and
p1.begdate < @currentdate)
и
select ODT.*, e.*, p.*
from ODT
inner join Employee e on e.eid = ODT.eid
inner join Paid p on e.pid = p.pid
если добавить вторую дату (завершения), то
select ODT.*, e.*, p.*
from ODT
inner join Employee e on e.eid = ODT.eid
inner join Paid p on e.eid = p.eid
where @currentdate between p.begdate and p.enddate
В случае с ID нужна процедура перевода сотрудника на новую запись истории. Если, скажем, определена история на будущее - план, то по дате переход на новый план осуществляется автоматически, по ID - нет. Пополнение истории в обоих случаях выполняется через процедуру. В случае с ID нельзя легко переместить всю систему в прошлые состояния - нужно править ID в каждой записи справочника. В случае с датой достаточно изменить параметр @currentdate - всё приводится автоматически. Первый запрос тяжелее второго и третьего.
Выбор варианта зависит от специфики задачи. В случае разделения БД на оперативную и архивную, в оперативной целесообразно использовать в основном ID, фиксируя даты, в архивной - даты, игнорируя ID.