2014-12-06 111 views
0

我必须设计一个数据库。我正在寻找实体及其关系。但是每个关系似乎都有多对多的关系。举例来说,在我的情况:如何区分设计数据库时的多对多关系?

1)员工管理客户端

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

2)客户下单购买股票

这里客户可以订购零,一个或更多的股票买入和股票可以通过零,一个或多个客户订购。

3)客户订单卖出股票

这里客户可以订购零,一个或更多的股票出售和股票可以通过零,一个或多个客户订购出售。

这些是我的情况的一些例子。我很困惑如何区分这些关系。在我的场景中还有其他很多类似的情况。而且我很难概念化设计。

所以,请赐教我关于我的情况。

回答

0

这似乎有很多你正在开发的系统,可能有你没有提到的要求,所以它是不可能拿出一个完整的答案。但希望下面的一些内容能帮助你在描述时“设计概念化”。

1)这是一种非常常见的情况,有很多处理这些多对多关系的标准方法。

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

i。Ë

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

变为:

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

的主要挑战是什么经常称这些新的实体!有时他们可能只是像a_b_relationship,但如果能识别更有意义的名字是很好的。

2)看起来你需要做更多的分析来识别所有的实体。这样做的一种方法是通过对系统的描述并识别名词 - 通常如果描述中有名词,则适合在实体 - 关系图中包含实体。

“Order”作为您忽略的名词跳出。

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

在您的情况,我们就会有:

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

3)客户销售各类产品

在这里,你要识别客户端的其他角色,什么我在这里做的是问题,即是否“客户“在这个阶段是一个合适的实体。您可能会发现在“买方”和“卖方”方面进行思考比较容易,直到理解了首次设计。如果买卖双方有很多共同点(特别是如果一个人既可以是买方也可以是卖方),那么您最终可能决定使用单一实体。您的ERD工具可能会为此提供支持 - 搜索“子类型实体”或“实体子类型”。

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

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

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

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

0

这很难回答这个问题。设计中的一切都是情境化的。如果你确实需要存储哪些员工管理客户,而客户可以由很多员工管理,那么你的关系是多对多的。注意现实世界中的实体之间有很多关系;你应该只存储它们中哪些是重要的和必要的存储。另外一个例子,如果你的股票包含这种商品的可用数量,那么客户和股票之间的关系也是多对多的。

注意:请勿使用复数形式的名词作为表名,否则会导致您对关系感到困惑。

编辑:要在数据库表中应用多对多关系,您需要一个中介表。例如,关于客户和产品表,您应该创建一个名为CustomerProduct(或您想要的一切)的表。 CustomerProduct表包含两个外键,一个来自Customer表,另一个来自Product表。通常(并非全部)一个多对多的关系分解为两个多对一的关系。 看到这个Link

+0

有一个客户谁可以购买许多不同的产品和可以由许多不同的客户购买的产品表客户表。那么,如何在数据库设计中不允许多对多关系的情况下将其分解。 – user3127109 2014-12-06 07:07:48

+0

@ user3127109:这是不同的问题,我编辑了我的答案。请阅读编辑部分。 – 2014-12-06 09:10:38

相关问题