我必须设计一个数据库。我正在寻找实体和他们的关系。但是每个关系似乎都有多对多的关系。例如,就我而言:
1)员工管理客户
这里的员工可以管理零个或多个客户。同样,客户端由一个或多个客户端管理。
2)客户下令购买股票
此处客户可以订购零个,一个或多个股票以进行购买,并且可以通过零个,一个或多个客户订购股票。
3)客户下令出售股票
在这里,客户可以订购零个,一个或多个股票进行销售,并且可以通过零,一个或多个客户订购股票以进行销售。
这些是我的情况的一些例子。我很困惑如何分离这些关系。在我的场景中还有其他许多这样的案例。我很难概念化设计。
所以,请告诉我有关我的情况。
答案 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范式。只有在完成此操作并确信设计反映了要求后,您才应该考虑如何在数据库中实现设计。这就是我多年前学到的东西!