-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)

样本数据:

示例从客户中选择 *;

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

从用户中选择 *;

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

从地址中选择 *;

+----+-----+---------+ 
| 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

这种安排在多个用户与客户共享地址的情况下失败,目前解决此问题的唯一方法是复制地址中的记录并更改 id2 号码。目前这只影响数据库中的一个案例。

在用户不与客户共享地址的情况下,我无法制定一个选择语句,该语句将找到客户姓名、客户地址、用户姓名和用户地址。这种情况适用于大约 30% 的记录。

任何关于如何解决这种混乱的建议都将受到欢迎。

理查德

4

1 回答 1

0

总结一下我认为您所描述的内容:一个地址可以由多个用户共享,但一个用户/客户只能有一个地址。

听起来你的多对一关系倒退了。

这意味着,您在地址表中有一个指向客户/用户的外键,而您真正想要的是指向地址的客户/用户表中的外键。但这有点难看......所以你可以用几种方法来清理它:

客户也是用户吗?如果是这样,在 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 回答