1

我有两个实体,名为“总公司”和“分公司”,属于某家公司。总公司可以有 1 个或多个分公司。

但是,一家公司只能有一个主要办公室,这是所有其他主要办公室的中心位置。我应该如何模拟这种情况?

  1. 使用 2 个实体,Main并且Branch,其中Main将有一个布尔属性Central。我认为这很糟糕,因为它会导致传递依赖?
  2. 有 3 个实体 ,MainBranch,Central办公桌Central只有一行?
  3. 或者,最后,拥有 2 个实体MainBranch, whereMain将与自身发生关系。

编辑:一家公司可以有多个主要办公室。

4

4 回答 4

1

出于建模目的,您可能会拥有三个实体:公司、总部、分支机构。公司将与主要办公室有一对多的关系;总公司与分公司的关系是 0 对多。这似乎捕捉到了数据的逻辑结构。

我想你也在问物理结构。逻辑结构可以直接映射到物理结构上,但这不是必需的。问题变成了如何使用数据。

逻辑模型的一种合理实现将有一个公司表和一个办公室表,其中:

  • 一个标志,指定它是主要办公室还是分支机构
  • 分支办事处指向主办事处的自加入密钥,限制“匹配回”必须是主办事处
  • 所有办公室共有的一堆字段
  • 一种或另一种类型共有的少量字段

另一种合理的实施方式是将主要办事处和分支机构放在不同的表中。这更接近数据的逻辑模型。但是,我想很多查询会合并这两个表,使单表方法在实践中更有效(但不一定)。

不幸的是,关系数据库并没有很好地实现类继承的思想。

于 2012-06-02T21:13:45.947 回答
1

创建实体CompanyEntity办公室。Company从到建立 1 到 M 关系Office。Office 有一个类型 - 要么Main要么BranchOffice从自身创建 1 到 M 关系。这种递归关系是分支机构与总部的关联。最后添加一个从 Office 到 Company 的 1 对 1 关系,并使用角色名称来区分关系,以标识CentralOffice。

您还可以将 Office 设置为超类型并设置 Main 和 Branch 子类型。这将使您能够对从 Main 到 Branch 的 1 到 M 关系建模,并更明确地显示业务规则。

如果我可以在这里粘贴一个 ER 模型片段,那就太好了!关键是Office是这里唯一的实体,主分支是Office的子类型。Central 根本不是一个实体,而是办公室和公司之间的关系角色。

于 2012-06-02T21:13:53.657 回答
0

Main office在和之间建立一对一的关系Company,然后在 和 之间建立多对一的Branch office关系Main office

Branch office和之间没有直接关系Company,但可以很容易地通过 传递推断Main office

于 2012-06-02T21:00:53.630 回答
0

您可能希望在 ER 模型中使用继承。您有一个通用的 Office 超类和 Branch/Main 子类。公司将与 Main Office 建立多对一关系,并与 Main Office 建立一对一关系以代表中央办公室。

于 2012-06-02T21:13:07.913 回答