参照完整性,每个表中有多个分配?

时间:2014-06-30 02:44:31

标签: sql referential-integrity

好的,我有一个项目表和一个员工表。首先,我一直很困惑如何设置PK和FK。

我有Customers表,我想要它,所以1个客户可以一次拥有多个项目。所以解决方案是将CustomerId放入Projects表并使其成为外键吗?

问题是,我希望在任何特定时间都有多名员工参与项目,显然每个项目都需要多名员工。如何在它们之间设置参照完整性?

4 个答案:

答案 0 :(得分:1)

您需要一个额外的表格ProjectsEmployees。它与ProjectsEmployees都有外键关系。

答案 1 :(得分:1)

您可以为Foreign KeyEmployee表创建一个包含Project的缓冲表,以建立many-to-many关系。例如:

Table: ProjectAssign
PK: ProjectAssignId
FK: EmployeeId
FK: ProjectId
Unique Constraint: EmployeeId & ProjectId

这样,您可以在many-to-manyemployee之间建立project关系。唯一约束,以确保您没有冗余数据。

注意

您也可以将composite key应用于EmployeeIdProjectId,但我认为这不是一个好主意

答案 2 :(得分:0)

因此,您有1个项目,该项目可以一次与多个员工和多个客户相关。 因此,Project表是您的主表。 您可以在Employee和Customer表中将项目表的ID添加为FK。 而且,ID列的组合可以用作PI,以便在AMP之间具有均匀的行分布。 这些表是维表,我想它不会大数百万行,因此您不需要另一个关系表来存储键。 Project表将通过“一对多”关系与Employee表和Customer表连接。 Employee和Customer表将通过“多对一”关系与Project表联接。

我的意思有些照片。 enter image description here 我希望它对您有用。

答案 3 :(得分:0)

这类许多关系是通过桥表处理的。

您可以有一个桥接表,该表为每个客户维护多个项目,每个项目可以有多名员工参与其中。

CustomerProjectEmployee

+-------------+------------+-------------+
| CustomerID  | ProjectID  | EmployeeID  |
+-------------+------------+-------------+
|           1 |          1 |           1 |
|           1 |          2 |           1 |
|           1 |          3 |           1 |
|           1 |          1 |           2 |
|           1 |          2 |           2 |
|           1 |          3 |           2 |
+-------------+------------+-------------+

在这里,对于customerID(1)的项目(1,2,3),员工(1,2)做出了贡献。