如何在设计数据库时区分多对多关系?

时间:2014-12-06 06:24:12

标签: database entity-relationship

我必须设计一个数据库。我正在寻找实体和他们的关系。但是每个关系似乎都有多对多的关系。例如,就我而言:

1)员工管理客户

这里的员工可以管理零个或多个客户。同样,客户端由一个或多个客户端管理。

2)客户下令购买股票

此处客户可以订购零个,一个或多个股票以进行购买,并且可以通过零个,一个或多个客户订购股票。

3)客户下令出售股票

在这里,客户可以订购零个,一个或多个股票进行销售,并且可以通过零,一个或多个客户订购股票以进行销售。

这些是我的情况的一些例子。我很困惑如何分离这些关系。在我的场景中还有其他许多这样的案例。我很难概念化设计。

所以,请告诉我有关我的情况。

2 个答案:

答案 0 :(得分:0)

这个问题很难回答。设计中的一切都是情境化的。如果你真的需要存储哪些员工管理客户,而客户可以由许多员工管理,那么你的关系是多对多的。注意现实世界中的实体之间有很多关系;你应该只存储哪些是重要的和必要的存储。

再举一个例子,如果你的股票包含这类商品的可用数量,那么客户和股票之间的关系也是多对多的。

注意:不要为表格的名称使用复数形式的名词,这会让你对关系感到困惑。

编辑:要在数据库表中应用多对多关系,您需要一个中介表。例如,关于Customer和Product表,您应该创建一个名为CustomerProduct的表(或者您想要的所有内容)。 CustomerProduct表包含两个外键,一个来自Customer表,另一个来自Product表。通常(并非所有时间)一对多关系分解为两个多对一关系。 请参阅此Link

答案 1 :(得分:0)

对于您正在开发的系统而言似乎有很多,并且可能有您未提及的要求,因此无法提出完整的答案。但希望下面的一些内容可以帮助您概念化设计"正如你所描述的那样。

1)这是一个非常常见的场景,几乎是处理这些多对多关系的标准方法。

如果有2个实体A和B具有多对多关系,那么通常会引入一个由2列组成的实体C - 一个是A的唯一ID的外键,另一个是外键的外键。 B的唯一ID。您将删除实体A中指向B的外键列,反之亦然。

|-----| 
|  A  |  
|-----| 
  \|/
   |
   |
  /|\
|-----| 
|  B  |  
|-----| 

变为:

|-----| |-----|
|  A  | |  B  |
|-----| |-----|
   |       |
   |       |
   |       |
  /|\     /|\
|-------------|
|      C      |
|-------------|

主要挑战通常是将这些新实体称为什么!有时他们可能只是a_b_relationship,但如果能识别出更有意义的名字,那就更好了。

2)看起来您需要进行更多分析以识别所有实际实体。这样做的一种方法是浏览您对系统的描述并识别名词 - 通常,如果描述中有一个名词,那么在实体关系图中有一个实体是合适的。

"订单"跳出你忽略的名词。

通常,对于订单处理,您将拥有2个实体 - 包含日期,总价值,客户等的订单,以及一个子订单行,用于标识订购了多少产品和单个价格。因此,在电子商务中,购物车将成为订单,购物车中的每个商品都将成为订单行记录。

在您的方案中,我们有:

|----------|            |-----------|
|  client  |            |  product  |
|----------|            |-----------|
      |                       |
      |                       |
      |                       |
     /|\                     /|\   
|-------------|       /|-------------| 
|    order    |--------|  orderline  |
|-------------|       \|-------------| 

3)客户销售许多产品

在这里,您要为客户确定一个额外的角色,我在这里做的是质疑"客户"在这个阶段是一个合适的实体。您可能会发现更容易从"买家"和"卖家"直到第一次切割设计被理解。如果买方和卖方有很多共同点(特别是如果一个人既可以是买方也可以是卖方),那么您最终可能决定使用单一实体。您的ERD工具可能会为此提供支持 - 搜索"子类型实体"或"实体子类型"。

详细信息将取决于您的实际应用,但可能是每个订单行应与卖家有关系,订单与买方有关系。这将取决于例如买方是否有可能订购特定产品的多个项目,其中一些来自一个卖方而一些来自另一个卖方。它可能会变得复杂!

此外,考虑您是否需要在销售之前记录卖家的股票可能会有所帮助。在这里区分"产品"和" stock",例如

|---------| |-----------|
|  seller | |  product  |
|---------| |-----------|
   |           |
   |           |
   |           |
  /|\         /|\
|-----------------|
|      stock      |
|-----------------|

作为一般性评论,我说它确实有助于逐步完成设计过程。因此,一旦获得初始模型,将需要存储的所有数据项分配给相应的实体,并有条不紊地确保设计处于第一范式,然后是第二范式,然后是第3范式。只有在完成此操作并确信设计反映了要求后,您才应该考虑如何在数据库中实现设计。这就是我多年前学到的东西!