0

我有一个名为 Project 的表。为简单起见,假设它有一个名为 projectId 的列。

项目
---------
项目 ID PK

我还有一张桌子。它被称为子项目。它有两列,一列称为projectId,另一列称为subProjectId。两列构成主键。

子项目
--------
项目 ID PK
子项目 ID PK

他们的工作方式是您在项目表中列出了一堆项目。其中一些项目可以是项目的子项目。例如,如果项目表有 3 行这样

项目
--------
项目编号
    1
    2
    3

项目 2 和 3 可以被认为是项目 1 的子项目。这是子项目表的来源。为了表示这一点,子项目看起来像这样

子项目
--------
1 ,2
1 ,3

这意味着项目 2 和项目 3 是项目 1 的子项目。

我在为此创建模型时遇到问题。在 SubProjects 表中,我需要 projectId 和 subProjectId 来引用 Projects 表中的 projectId。但是,关键是他们可以引用不同的项目。我想我应该使用外键来做到这一点?这有意义吗?这是允许的吗?有一个更好的方法吗?

我正在使用 MySql 和 MySql 工作台,但似乎无法解决这个问题。有任何想法吗?

编辑一个项目可以是多个表的子项目。

4

5 回答 5

1

这样做应该没问题。您能否更具体地说明为什么无法设置?

如果一个项目只是一个项目的子项目,另一种方法是在项目表中添加一个“父项目”列,其中一个 FK 指向“自身”。我认为如果你这样做,你的查询很可能最终会变得更简单。

于 2012-06-06T19:09:39.337 回答
0

我将使用列创建一个具有层次结构的表,例如:

project_id    parent_project_id
-------------------------------
1             null
2             1
3             1

然后你可以说如果一个项目parent_project_id是空的,它不是任何其他项目的子项目。否则,该项目是 中所列项目的子项目parent_project_id

于 2012-06-06T19:10:15.173 回答
0

为什么不在表 Projects 中添加一个名为 ParentProjectID 的新字段。对于项目,它将为空,对于子项目,它将在那里有其父项目 ID。

于 2012-06-06T19:10:42.870 回答
0

您如何考虑创建一个具有层次结构的表?使用您的示例,它将类似于

Projects
----------

ProjectID | ParentID
----------|----------
   1      |   NULL
   2      |   1
   3      |   1
于 2012-06-06T19:13:33.290 回答
0

您可以将外键约束添加到“子项目”中的两个列,参考“项目”表中的 ProjectId 列。这样做不会强制两列在“子项目”中的行上具有相同的值。当您将新行插入“子项目”(比如说 2,3)时,服务器将检查:

  • Projects 表中有一行的 ProjectId 值为 2
  • Projects 表中有一行的 ProjectId 值为 3
  • “子项目”中还没有相同的行

这种模型可以工作,但不能保证项目层次结构是“健全的”。数据库本身没有任何内容可以阻止您将 (2,3) 和 (3,2) 都插入“子项目”表中。或 (1,1) 就此而言。因此,您将不得不在您的应用程序逻辑中强制执行这一点。

于 2012-06-07T09:49:16.523 回答