0

name_eml、host_eml、および domain_eml の 3 つの属性を格納するテーブル email_eml を持つデータベースがあります。電子メール名、ウェブサイトの名前、ドメイン名 (.com .net など) を保存する @ や . 変数のいずれかで。これにより、ある程度の柔軟性が得られます(たとえば、平均的な名前の長さ(@記号の前)を確認する方が高速になります)。メール名に関するいくつかの統計を収集できます。name_eml 属性からユーザー名を作成することもできます。しかし、人々がメールを送信している場合や、メール全体を比較する必要がある場合にも、処理が負担になります。これにより、追加の @ と . 統計を収集したい場合は、スクリプトを使用して名前を分離させます。

メールを 3 列ではなく 1 列に格納した方がよいのではないでしょうか。より適切な方法またはより正規化された方法の 1 つですか?

メールアドレスを保存するための両方のアプローチの長所と短所を回答に含めてください。(メールを 3 列に保存してもメリットはあまりありません)

4

3 に答える 3

2

@またはを格納しません。変数のいずれかで。

まあ、それはすべきです。cat.call@somedomain.com有効なメールアドレスです。

メールを3列ではなく1列に保存したほうがいいのではないかと思います。方法の1つは、より適切な方法ですか、それともより正規化された方法ですか?

これは正規化とは何の関係もありません。それは複雑なデータ型と関係があります。

リレーショナルモデルでは、任意に複雑なデータ型を使用できます。一般的に使用される複雑なデータ型はタイムスタンプであり、通常、年、月、日、時、分、秒、およびマイクロ秒が含まれます。

タイムスタンプを指定すると、日付のみを知る必要がある場合もあれば、年または時間のみを知る必要がある場合もあります。リレーショナルモデルは、複雑なデータ型を処理するときにdbmsに特定の負担を課します。複雑なデータ型の場合、dbmsは、データ全体を返すか、さまざまな部分を返す関数を提供する必要があります。重要なのは、ユーザーがタイムスタンプから1時間だけを必要とする場合、ユーザーはそれを取得するためのコードを記述しないということです。

SQLデータベース管理システムはタイムスタンプを適切にサポートしています。私が精通しているすべてのdbmsは、タイムスタンプのさまざまな部分を返す関数を提供します。それらのどれも電子メールアドレスのネイティブサポートを持っていません。

SQLプラットフォームでは、データベースをリレーショナルモデルに近づけるための選択肢が少なくとも2つあります。データベースサーバーに組み込むことができる関数を作成することも(dbmsとプログラミングスキルで許可されている場合)、データ型を分割して、他の値と同じようにそれぞれを完全にアドレス指定できるようにすることもできます。

そのように分割するのが理にかなっているデータ型はおそらくいくつかありますが(番地はそのうちの1つである可能性があります)、電子メールアドレスを分割する説得力のある理由は実際にはわかりません。

これにより、ある程度の柔軟性が得られます(たとえば、平均名の長さ(@記号の前)のチェックが高速になります)。電子メール名に関するいくつかの統計を収集できます。また、name_eml属性からユーザー名を作成することもできます。

それは事実ですが、今のところ、ユーザー名の平均的な長さについて興味深いことは何も想像できません。私はあなたの理由のどれも説得力があるとは思いませんが、あなたは私よりもあなたのアプリケーションについてもっと知っています。

ピースに対して本当に多くの操作を行う必要がある場合は、ピースを分離しておく方が理にかなっています。より「通常の」クライアントコードは、断片を連結するビューを介して電子メールアドレスにアクセスする必要があります。(連結は、実行時に電子メールアドレスを解析するよりもはるかに簡単です。)

于 2012-06-17T02:00:22.573 に答える
0

正規化に関しては、共通の側面 (ホストや特にトップレベル ドメインなど) を分解したら、外部関係としてモデル化する必要があります。したがって、次の 3 つのテーブルが作成されます。

  1. メール名
  2. メールホスト
  3. メールTLD

次に、emailNames には 3 つの列があります。

  1. メール名
  2. ホスト ID
  3. tldID

「TLD」を使用したことに注意してください。これは、ホスト名が大幅に重複する唯一の部分である可能性が高く、「.」を期待できるためです。TLD の開始前のホスト名の文字。

于 2012-06-17T02:17:32.290 に答える
0

メール アドレスを 3 列に格納することは非常にまれです。メールの @ 記号の前の部分で検索のようなことをしたい場合は、LIKE クエリを使用できます...

SELECT email FROM people WHERE email LIKE 'john.smith@%';

SQL クエリでは実行できない実際の例を知りたいです。

于 2012-06-16T11:18:56.343 に答える