如何在逆向工程时确定表之间的关系(1:1,1:n,n:m)

问题描述:

我的数据库中已经创建了一些表,现在我需要为这些表绘制ER图。如何在逆向工程时确定表之间的关系(1:1,1:n,n:m)

  1. 标识的 表使用键
  2. 决心PK FK关系现在我需要确定表之间的基数之间的主键和外键。我如何 这样做?请让我知道在评估1:1,1:M和M:M关系时是否存在需要考虑的一组规则。

让我把两张桌子,在那里我打的一个例子:

  • 表A具有由PID和identitytype复合键。
  • 表B有一个由pid和maritalid组成的组合键。
  • 表A和表B使用pid相互关联,pid 在两个表中都不为空。

让我知道表A和表B之间的关系类型可能是1:1,1:M还是M:M。另外,请让我知道您在达成关系式结论时遵循的步骤顺序。

谢谢, Dex。

你应该看看这太问题: postgresql-describe-table

在现实中,不看模式定义,没有禁忌正面的例子,你有没有办法知道如果表1的方式:1, 1:n或n:m关系(如果n = m = 1)。

您可以执行扫描,但它是确定该关系的约束条件。

如果您没有这些数据,那么您只能用示例演示1:n和n:m,但不能证明1:1不是没有约束定义的n:m。

A 1:1的关系将看起来像这样:

PK - PK

这只能通过一对一(零或一),因为这两个表只能有唯一的密钥,1: n和n:m是不允许的。为了确保单独表格的PK = PK,这必须受到某些级别的软件的约束,或者更常见的情况是,如果您确实需要1:1,则将数据存储在同一个表格中。否则,您需要通过事务性插入或者其他方式确保密钥协调。不建议自动生成密钥。

A 1:N的关系如下所示:

PK - FK

的FK(外键)定义它被约束到另一个表中的主键,但也可以是多个。

的N:M关系是这样的:

PK - FK | FK - PK

那里有三个表。两个具有主键(PK)的规范化表和一个具有FK关系的连接表,定义了表之间的映射n:m。

当然,所有这些可能会受到使用数据库的代码的限制,因此表约束是数据模式的唯一可靠定义。

外键必须指向另一个表中的主键,因此您不能拥有FK:FK关系,并且实际上没有由数据库定义的PK:PK关系。这必须通过代码事务性插入来限制。通常的约定是按照规范化的数据格式将PK:PK数据存储在同一个表中。

好的,所以,要添加评论,针对表A和B;所有你可以肯定地说,你有主键包括pid:identitytype和pid:maritalid,如果是这种情况,为了讨论的缘故,说identitytype和maritalid是整数,那么你有int:int和int: int,它不会告诉你任何事情。如果身份类型与婚姻重叠,那么就没有办法可靠地将他们分开。如果你只在pid上匹配,那么你有一个N:M的关系,因为你有pid:N-pid:M个不同的可能性,这将导致一个N:M的关系。

+0

我有我的约束信息,我有主键和外键约束,如果你需要更多的约束在上面引用我的例子让我知道,我可以与你分享德马克...我想知道使用这些表说明我们如何识别 – Dex

+0

添加到答案中的信息...参见上文。 –

+0

如果您可以共享约束信息,那么这可能会有所帮助。 –

实体关系模型中的关系与您的想法有很大不同。关系不是由外键约束表示的 - 这是旧的网络数据模型,并且仅限于二进制关系。实体关系模型表示表中实体集之间的n元关系,而不是表之间的关系。

外键约束将一组列的值限制为另一组列的值的子集。它们有效地用于强制实体集(域) - 例如,确保每个person_id列都是表示系统中所有已知人员的子集。 FK约束仅在更新期间使用 - 您可以从数据库中删除所有FK,并且您的SELECT查询和JOIN将与以前完全一样,进一步证明它们不代表关系。

关系是两个或多个实体集之间的关联,每个实体集都由一个合适的关键字表示。关系实例始终记录在表格的行中。例如:

  • A 1:驾驶执照和一个人之间1的关系将通过具有所述许可证密钥和人密钥一起作为一个表中的两列来表示,并且二者(单独)唯一的限制。无论是在许可证表格,人员表格还是单独的驾驶执照表格中,都是一个实施细节。

  • 汽车与其所有者之间的1:N关系可以通过将汽车钥匙和人员钥匙组合在一起作为表格的两列来表示,并且在多方面设置的实体受到唯一约束。这通常在记录多方实体属性的表中实现。

上述关系非常简单,我们可以对它们进行非规范化处理,而无需将关系记录在单独的表中。对于较高的关系,但是,我们需要独立的表:

  • 的M:学生和学科之间的N个关系将通过使学生键和对象键一起作为表的两列,和组合来表示这两个独特的约束。

  • 供应商,产品和地区之间的M:N:P关系可以通过将供应商关键字,产品关键字和地区关键字组合在一起作为表格的三列以及三者的组合来唯一约束。

  • 区域,产品和供应商(唯一授权)之间的M:N:1关系可以通过将区域关键字,产品关键字和供应商关键字组合为表格的三列以及区域和产品密钥受到唯一限制。

查看模式?

如果该实体集的特征谓词(其必需属性)表示在不同的表中,则该关系的每个角色/组件都可以定义一个外键约束。这意味着一个单一的n元关系可能需要n个不同的FK约束。

为了测定从现有的表的关系的基数:

  1. 确定在表中表示的实体集。并非所有列都代表实体集合 - 有些代表值集合,这意味着这些值本身就意味着标签或度量。

  2. 确定实体集的哪些组合唯一约束在一起。这些是关系的许多方面,并且我们将给它们诸如M,N,P等的变量。

  3. 每个其他实体集合都依赖于前面的组合,并且在基数中由1表示。

这不是那么简单。除了实体集之外,表的关键还可能涉及值集。在这些情况下,我们有一个弱的实体/识别关系/子类型的情况。这些通常(但不总是)1:N关系,其中子实体的密钥与父实体的密钥部分重叠。

欲了解更多信息,我推荐Peter Chen的论文The Entity-Relationship Model - Toward a Unified View of Data

+0

您能否将这些规则应用于我的示例示例,因为这有助于我更好地理解您的解决方案。 – Dex

+0

你有两个表可能与'pid'表示的相同实体集有关。表B可能表示M:N关系 - id字段往往是实体集的代理标识符,并且这两列构成其主键。表A可能描述了一个子类型或弱实体集合,这意味着'pid'(标识父实体集合)和'pid,identitytype'(标识子实体集合)之间的1:N标识关系。 – reaanb