-1

Mysql、手書きの封筒メモ、Excel スプレッドシート、完全に欠落しているレコード (質問しないでください) の不浄な組み合わせを開始したときのデータベースを整理する際に、次の問題があります。続く。

私は非常に単純化された形式で4つのテーブルを持っています:-

customers
---------
id int not null primary key,
name varchar(50) 

users
---------
id2 int not null primary key,
name varchar(50)

address
-------
id int, 
id2 int, 
country varchar(50)

product
-------
id int, 
id2 int, 
item varchar(50)

サンプルデータ:

例 select * from customers;

+----+------+ 
| id | name | 
+----+------+ 
|  1 | Fred | 
+----+------+ 

ユーザーから * を選択します。

+----+---------+ 
|id2 | name    | 
+----+---------+ 
|  1 | Wilma   | 
|  2 | Pebbles | 
+----+---------+ 

select * from address;

+----+-----+---------+ 
| id | id2 | country | 
+----+-----+---------+ 
|  1 |  1  | Bedrock | 
|  1 |  2  | Bedrock | 
+----+-----+---------+ 

商品から*を選択してください。

+----+-----+---------+ 
| id | id2 | item    | 
+----+-----+---------+ 
|  1 |  1  | Item1   | 
|  1 |  2  | Item2   | 
+----+-----+---------+ 

customers.id は主キーで、address.id と product.id へのリンクです

users.id2 は主キーで、address.id2 と product.id2 にリンクしています

複数のユーザーが 1 人の顧客とアドレスを共有している場合、この配置は失敗します。現時点でこれを回避する唯一の方法は、アドレスのレコードを複製し、id2 番号を変更することです。現在、これはデータベース内の 1 つのケースにのみ影響します。

ユーザーが顧客とアドレスを共有していない場合、顧客の名前、顧客の住所、ユーザーの名前、およびユーザーの住所を見つける select ステートメントを実行できません。この状況は、レコードの約 30% に当てはまります。

この混乱を整理する方法についての提案は大歓迎です。

リチャード

4

1 に答える 1

0

あなたが説明していると思うことを要約すると、アドレスは複数のユーザーが共有できますが、ユーザー/顧客は1つのアドレスしか持つことができません.

多対一の関係が逆になっているようです。

つまり、アドレス テーブルに顧客/ユーザーを指す外部キーがありますが、実際に必要なのは、アドレスを指す顧客/ユーザー テーブルの外部キーです。しかし、それはちょっと醜いです...だから、それをきれいにするいくつかの方法があります:

顧客もユーザーですか?その場合、Address に User を指す単一の外部キーがあり、User から Customer への外部キーはかなりクリーンです。

そうでない場合は、ユーザー/顧客と住所を橋渡しするテーブルを検討してください。このようなもの:

User_Cust_ID,    Type,       Address_ID
1                Customer    5
2                Customer    1
1                User        1

これにより、同じアドレスを共有するユーザーと顧客を解決できます。

HTH...

于 2013-04-09T15:45:51.683 に答える