私は SQL データベースの設計者であり、アプリケーション プログラマーでもあります。
今、あなたはこのようなものを持っています。
create table users (
user_id integer primary key,
user_name varchar(35) not null unique
);
create table teams (
team_id integer primary key,
team_name varchar(35) not null unique
);
次の表は、各ユーザーが最大 1 つのチームのメンバーになることができるという現在の要件を実装しています。(私は、一部のユーザーはどのチームのメンバーでもない可能性があると想定しています。おそらく、雇用されてから出勤するまでの間だけです。)
create table team_members (
user_id integer primary key references users (user_id),
team_id integer not null references teams (team_id)
);
その要件が変わり、ユーザーが複数のチームのメンバーになることを許可する必要がある場合は、主キーを {user_id} から {user_id, team_id} に変更するだけです。アプリケーション コードを変更する必要はまったくありません。(ただし、以下の「意見の相違を文書化する」を参照してください。)
このようにチームメンバーシップを実装したいとします。
create table users (
user_id integer primary key,
user_name varchar(35) not null unique,
team_id integer null references teams (team_id)
);
その場合でも、チーム メンバー ビューを実装し、アプリケーション コードでそのビューを使用する必要があります。アプリケーションによっては、これを更新可能なビューにする必要がある場合があります。
create view team_members as
select user_id, team_id
from users;
これは、チーム メンバーシップをユーザーのテーブルに入れると、そのテーブルの述語が破損するためです。ユーザーのテーブルではなくなりました。これは、ユーザーとそのチーム メンバーシップのテーブルです。したがって、「ユーザー」という名前は正確ではありません。「users_and_team_membership」のような名前が必要です。(データのリレーショナル モデルと SQL の両方で、テーブル名は変数の名前であり、デフォルトではデータベースのパブリック API の一部です。ここでの原則は、「悪いコードにコメントしないでください。書き直してください。 ")
しかし、テーブル名を修正するか、紛らわしい「users」という名前のままにしておくと、1 つの混乱が 2 つになるだけです。「2」。1) 1 つのテーブルに 2 つの異なる種類のデータが格納されているため、2) 正確な名前を使用してテーブル "users" を失うか、誤解を招くような名前を使用してテーブル "users" を保持しているためです。
意見の相違を文書化する
また、この意見の相違を文書化して、アプリケーション プログラマーが間違ったことをするのを防ぐ必要があります。「ユーザーが 1 つのチームだけのメンバーであると仮定することは、チェックされていない実行時エラーです」のようなステートメントで十分です。
YAGNI は、データベースの設計と開発において、アプリケーション開発における YAGNI の意味とまったく同じ意味を持っているわけではありません。アプリケーション開発者は自分のコードを見て、1 つのデータベースを確認します。データベース設計者はデータベースを調べ、何十年にもわたって数十の異なる言語で書かれた何百ものプログラムを見て、不適切に書かれたパブリック API のコストを計算します。不適切なパブリック API を修正するには、何百ものプログラムの変更が必要になる場合があります。それは大金です。たくさんのお金。