多くのリレーショナルデータベース設計には、他のテーブルで参照されるフィールドがあります。
たとえば、一意のユーザー名を持つユーザーテーブルと、アドレスデータを格納する2番目のテーブルについて考えます。
私が言えるレイアウトの1つは、ほとんどのソフトウェアで観察されているため、次のような自動インクリメントIDを使用するという一般的なアプローチです。
Table users
===========
userId int primary auto_increment
userName varchar unique
Table adressdata
==========
userId int references users.userId
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userId,adress_type))
これが以前のやり方であり、ほとんどの場合私はそれを見てきました。
別の方法は次のとおりです。
Table users
===========
userName varchar primary
Table adressdata
==========
userName varchar references users.userName
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userName,adress_type))
ここでも、完全なユーザー名をadressdataテーブルに格納します。
私にはこれには次の利点があります:
別のテーブルに結合する必要なく、テーブルからすぐにユーザー名を選択できます。この例では、これはおそらくアプリケーションの観点からはあまり関係がありませんが、単なる例です。
auto_incrementの競合がないため、マスターマスターレプリケーション環境でデータベースをスケーリングする方が簡単な場合があります。
しかし、欠点もあります:
- 2番目のテーブルのフィールドのインデックスとデータ(ただし、関連性が高いのはおそらくインデックス)のスペース要件が高くなります。
- ユーザー名を変更すると、すべてのテーブルに反映される必要があります。これは、1つのテーブルでユーザー名を変更してIDをそのままにするよりも、多くのリソースを消費します。
私の意見では、テキストフィールドを操作してインクリメントIDを使用しない方がはるかに簡単です。トレードオフは最小限であり、ほとんどのアプリケーションでは関係ありません。
もちろん、いくつかのオブジェクトはその性質上、増加する番号で識別されます(たとえば、フォーラムの投稿には、タイトルなどの一意のフィールドがおそらくないため、増加するIDを受け取る必要があります)。
しかし、まったく異なる方法でデータベースレイアウトの設計を開始する前に、私が考えていないことがあるかどうかを知りたいと思います。
ベストプラクティスはありますか?
私が考えていなかった長所/短所はありますか?その効果は後の時点で発生する可能性がありますか?
上記の点に関してデータベースをどのように個人的に設計しますか、またその理由は何ですか?