最適化する内容を説明せずに、質問のタイトルに「最適化」という言葉を使用します。
クエリのパフォーマンスについて話しているのであれば、問題はありません。保持できるレコードの数は、毎日のセッション数によって決まります (特定のセッションに参加できるのは 1 つのチームのみであるため)。1 日に 10 セッションを実行すると、1 か月あたり 300 レコードになります。1 日に 100 セッションを実行すると、1 か月に 3,000 レコードになります。これらは大量のデータではありません。したがって、存在しないパフォーマンスの問題を回避するためにデータベースの設計を歪めることで、悪い決定を下しています。
コメントの 1 つでスプレッドシートについて言及しました。それは悪いデザインではありません。一番上の行にはセッションがあり、その下にはチームがあり、セルはチームがセッションに参加したかどうかを示しています。これらは、SESSIONS、TEAMS、および交差テーブル TEAM_SESSIONS の 3 つのデータベース テーブルにマップされます。チームがセッションに参加した場合、TEAM_SESSIONS のレコードのみが必要です。
概念実証として、私は Oracle で 3 つのテーブルを作成しました。
SQL> desc teams
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
NAME VARCHAR2(20 CHAR)
SQL> desc sessions
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
SSN_DAY DATE
SSN_START NUMBER(4,2)
SSN_END NUMBER(4,2)
SQL> desc team_sessions
Name Null? Type
----------------------------------------- -------- ----------------------------
TEAM_ID NOT NULL NUMBER
SESSION_ID NOT NULL NUMBER
SQL>
Oracle 11g で導入された PIVOT 関数を使用すると、簡単にマトリックスを作成できます (DBMS の種類が異なれば、これにアプローチする方法も異なります)。ご覧のとおり、今日は 3 つのチームがセッションを予約しており、誰もランチタイムにトレーニングをしたくありません。Bec United はマスタードのように熱心です (またはトレーニングが必要です)。
SQL> select * from (
2 select t.name as team_name
3 , trim(to_char(s.ssn_start))||'-'||trim(to_char(s.ssn_end)) as ssn
4 , case when ts.team_id is not null then 1 else 0 end as present
5 from sessions s
6 cross join teams t
7 left outer join team_sessions ts
8 on (ts.team_id = t.id
9 and ts.session_id = s.id )
10 where s.ssn_day = trunc(sysdate)
11 )
12 pivot
13 ( sum (present)
14 for ssn in ( '9-11', '11-13', '13-15', '15-17', '17-19')
15 )
16 order by team_name
17 /
TEAM_NAME '9-11' '11-13' '13-15' '15-17' '17-19'
-------------------- ---------- ---------- ---------- ---------- ----------
Balham Blazers 0 1 0 0 0
Bec United 1 0 0 0 1
Dinamo Tooting 0 0 0 0 0
Melchester Rovers 0 0 0 1 0
SQL>
いずれにせよ、このデータ モデルの利点は、柔軟であることです。チームの出席頻度、出席時刻、出席曜日、常に予約されているセッション、ほとんど予約されていないセッションなどを数えることができます。また、データの管理も簡単です。特に、2 つのテーブルよりも 3 つのテーブル ソリューションの利点は、ダブルブッキングや非標準または重複する時間枠を簡単に防ぐことができることです。
ノーマライゼーションは、罪のない人をだますために使用する単なる月の言葉ではなく、実際的なメリットを提供します。少なくとも BCNF まで下げることが最善の考えではないシナリオはほとんどありません。