3

包 A 有一个桌面 Y 和一个监视器 Z。包 B 有一个桌面 Y 和两个监视器 Z。我想在实体设计器创建的数据库中表示这种关系。

StandardPackageStandardMachine(有台式机、显示器、笔记本电脑等)之间存在多对多的关系。每个季度,我们都会更新我们的包裹,客户会下订单。他们选择一个包,下订单后,该包StandardMachines会将其数据(类型、品牌、型号等)转储到新创建Machines的 .

问题在于实体设计器为StandardPackageStandardMachine关系创建联结表的方式。联结表有两列对应关系两端记录的 ID,联结表的主键是这两个 ID 的组合。因此,对于第一段中的示例,如果包 A 的 Id 为 1,包 B 的 Id 为 2,桌面 Y 的 Id 为 1,监视器 Z 的 Id 为 2,我需要的是

StandardPackageId | StandardMachineId
------------------|------------------
         1        |         1        
         1        |         2
         2        |         1
         2        |         2
         2        |         2

但显然你不能有两个 2/2 记录。

有没有一种好方法可以告诉实体设计器我打算做什么,以便它为联结表创建一个自动递增的主键列?还是我必须求助于手动创建联结表并自己处理关联?

顺便说一句,如果有人甚至知道如何改写我的问题标题,请这样做。

4

2 回答 2

1

还是我必须求助于手动创建联结表并自己处理关联

是的,你有。因为表不是联结表,而是一个实体。

多对多关联的语义与您想要表达的内容略有不同。常规 n:m 关联表中的一条记录表示“A 与 B 相关”。在您的表格中,它将表示“A 有 B 的实例”。

前一个表达式在重复时总是多余的:“A 与 B 有关”——好的,我们知道这一点。后者不是:“A 有另一个 B 实例”。所以有两个不同的实例,这意味着每个实例都有一个identity。身份是实体的核心概念。

StandardPackageStandardMachine即使它仍然是“虚拟机”,也只是表示包中机器实例的常规类。

于 2013-05-14T20:58:41.543 回答
1

您通常会做的是创建主/从关系。

我不确定你在做什么的背景。通常,您的包裹将有一个 1:many 的包裹:项目关联,每个项目行都有自己的行号(有时称为序列号),并且它与产品表有外键关系。即,像这样:

ID Name
1  Package A
2  Package B

ID PkgID Line(Seq) PrdID
1  1     1         1 
2  1     2         1
3  1     3         2
4  2     1         1
5  2     2         2

ID Name
1  Monitor Y
2  Desktop Z

通过这种方式,您可以拥有任意数量的单一类型。ID vs Line 的原因是每个订单的行号重复,而 ID 是表的唯一键。或者,您可以制作 PkgID 和 Line 的复合键。

于 2013-05-15T02:12:58.107 回答