Иногда (реальная или предполагаемая) избыточность является следствием бизнес-правила. В этом случае бизнес-правило гласит: «выписка, выданная для учетной записи, должна содержать только транзакции для филиалов, принадлежащих этой конкретной учетной записи».
Чтобы применить это правило, вы можете попытаться придумать схему базы данных, которая делает невозможной ее нарушение, или принудительно ее применить с помощью ограничения или триггера. И это кажется проще с StatementHeader.AccountID. В Oracle вы могли бы написать что-то вроде этого:
create or replace trigger statement_has_unique_account
before insert or update on Statement
referencing old as old new as new
for each row
declare
m integer;
n integer;
begin
select b.AccountID
into m
from Branch b
where b.ID = new.BranchID;
select s.AccountID
into n
from StatementHeader s
where s.ID = new.StatementID;
if m <> n then
raise_application_error(-1000, 'No way!');
end if;
end;
Без AccountID в StatementHeader вам придется написать сравнение со всеми другими AccountIDs из всех других операторов, которые имеют тот же StatementID, что приведет к более сложной последовательности операторов.
Так что я бы оставил AccountID в качестве внешнего ключа в StatementHeader и принудительно применял бизнес-правило с помощью триггера.