2009-08-27 13 views
0

私はこのデータベースの設計と正規化の問題

列のようないくつかのものがあります。

id desc name phone email fax ab bc zxy sd country state zip ..... 
1 a  ab 12  fff 12 w 2 3 2 d  sd  233 
2 d  ab 12  fff 12 s 2 3 1 d  sd  233 

をここでは、重複するアドレスやデータを繰り返すことができるように、上記のテーブルを正規化する方法があります。

ありがとうございます。

答えて

2

ここで簡単な答えです。アドレスフィールドを新しいテーブル(dupsを削除)に移動し、プライマリテーブルにFKを追加するだけで済みます。

表1(人または何でも)

id desc name phone email fax ab bc zxy sd address_id 
1 a  ab 12  fff 12 w 2 3 2 1 
2 d  ab 12  fff 12 s 2 3 1 2 
3 d  ab 12  fff 12 s 2 3 1 2 
4 d  ab 12  fff 12 s 2 3 1 1 

表2(アドレス)

address_id country state zip ..... 
1   d  sd  233 
2   e  ac  123 
+0

これはまさに私がやったことですが、peoblemは表1に新しい行を追加するときにどのようにアドレスidを挿入するのですか? – SweetGangster

+0

Accessにフォームを作成して、ユーザーが既存の住所を選択するか、新しい住所を入力させることができます。 1対多の関係を定義してフォームを作成するだけで済みます。 –

+0

最初に、表2のアドレスを追加します(またはそれがある場合はそれを探します)。その後、address_idをプルして残りのデータとともに表1に挿入します。 –

1

ジム・Wは良いスタートを持っていますが、別々にあなたの冗長アドレス要素を作り、さらに正規化しますテーブルも同様です。

住所データが繰り返されるテーブルを作成します(国、州など)。データテーブルが作成されたら、StateID、CountryIDなどの列をAddressテーブルに追加します。

既存のデータを修正するためのオプションが追加されました。素早く汚れていて、Updateステートメントを使って、新しく作成されたすべてのIDフィールドを正しいデータテーブルを指すように設定できます。あなたはかなり迅速にバッチ.sqlファイルとしてこれを行うことができますが、私はアドレステーブルを介してロールと新しいエントリに現在の「状態」を一致させようと多くのプログラム的なソリューションをお勧めします

UPDATE Addresses SET StateID=1 WHERE STATE='AL' 

状態テーブル。見つかった場合、AddressテーブルのStateIDは、States内の対応する行のIDで更新されます。

これでアドレステーブルから古い状態フィールドを削除できます。これは、別の状態テーブルにうまく正規化されているためです。

このプロセスは、すべての冗長データ要素に対して繰り返すことができます。しかし、IMO dbの正規化をとらえることができます。たとえば、正規化後に達成するために10回のジョインが必要な一般的なクエリがある場合、パフォーマンスが低下することがあります。私はあなたが正しい道にいると思うので、これはここには現れていないようです。

上記のコメントから:@ Lance私はそれに似た何かが欲しかったが、私は生のデータが単一のテーブルの形で来ていると私は精緻化し、それを2つのテーブルに送信する必要があるテーブル2にaddress_idを挿入する方法を教えてください。

新しく作成したIDを@@ IDENTITYを使用してアドレステーブルから取得し、address_IDをこの値で更新することができます。

+0

@@ IDENTITYを使用して新しく作成したIDをアドレステーブルから取得し、address_IDをこの値で更新することができます。これを少しはっきり説明できますか? – SweetGangster

+0

彼は、(アドレステーブル)address_idをIDENTITYデータタイプに設定することについて話しています(これはアクセス時の自律番号のようです)。その後、SQL INSERTコマンドを使用してそのテーブルにアドレスを挿入すると、この自動番号を取得して、対応するaddress_idフィールドを最初のテーブルに更新できます。 –

+0

2番目のテーブルのadress_idカラムをIDとして宣言しましたが、最初のテーブルadress_idは、2番目のテーブルの列の値に基づいて私は2つのテーブルの列を比較し、最初のテーブルのadres_idを更新するが、私のカーソルコードに何か問題があるようだと思ったSQLカーソルを使用して考えた入れ子のカーソルを使用していた – SweetGangster

関連する問題