@またはを格納しません。変数のいずれかで。
まあ、それはすべきです。cat.call@somedomain.com
有効なメールアドレスです。
メールを3列ではなく1列に保存したほうがいいのではないかと思います。方法の1つは、より適切な方法ですか、それともより正規化された方法ですか?
これは正規化とは何の関係もありません。それは複雑なデータ型と関係があります。
リレーショナルモデルでは、任意に複雑なデータ型を使用できます。一般的に使用される複雑なデータ型はタイムスタンプであり、通常、年、月、日、時、分、秒、およびマイクロ秒が含まれます。
タイムスタンプを指定すると、日付のみを知る必要がある場合もあれば、年または時間のみを知る必要がある場合もあります。リレーショナルモデルは、複雑なデータ型を処理するときにdbmsに特定の負担を課します。複雑なデータ型の場合、dbmsは、データ全体を返すか、さまざまな部分を返す関数を提供する必要があります。重要なのは、ユーザーがタイムスタンプから1時間だけを必要とする場合、ユーザーはそれを取得するためのコードを記述しないということです。
SQLデータベース管理システムはタイムスタンプを適切にサポートしています。私が精通しているすべてのdbmsは、タイムスタンプのさまざまな部分を返す関数を提供します。それらのどれも電子メールアドレスのネイティブサポートを持っていません。
SQLプラットフォームでは、データベースをリレーショナルモデルに近づけるための選択肢が少なくとも2つあります。データベースサーバーに組み込むことができる関数を作成することも(dbmsとプログラミングスキルで許可されている場合)、データ型を分割して、他の値と同じようにそれぞれを完全にアドレス指定できるようにすることもできます。
そのように分割するのが理にかなっているデータ型はおそらくいくつかありますが(番地はそのうちの1つである可能性があります)、電子メールアドレスを分割する説得力のある理由は実際にはわかりません。
これにより、ある程度の柔軟性が得られます(たとえば、平均名の長さ(@記号の前)のチェックが高速になります)。電子メール名に関するいくつかの統計を収集できます。また、name_eml属性からユーザー名を作成することもできます。
それは事実ですが、今のところ、ユーザー名の平均的な長さについて興味深いことは何も想像できません。私はあなたの理由のどれも説得力があるとは思いませんが、あなたは私よりもあなたのアプリケーションについてもっと知っています。
ピースに対して本当に多くの操作を行う必要がある場合は、ピースを分離しておく方が理にかなっています。より「通常の」クライアントコードは、断片を連結するビューを介して電子メールアドレスにアクセスする必要があります。(連結は、実行時に電子メールアドレスを解析するよりもはるかに簡単です。)