0

这就是我现在所处的位置。我有四个表:task、project、opportunity 和 task_xref。项目表和机会表都与任务具有一对多的关系。我将这些关系存储在 task_xref 中。每个表的架构看起来像这样(简化):

task
----
id(pk)
name

project
-------
id(pk)
name
...

opportunity
-----------
id(pk)
name
...

task_xref
---------
task_id(task id)
fkey(other table id)

假设项目和机会中的键将不相同 (GUID),因此机会无法获取项目的任务等等。这在表面上运作良好,一个外部参照表来维护任务和项目、机会(或将来可能需要任务关系的任何其他表)之间的关系。

我目前的困境是双向的。如果我希望获得单个项目或机会的所有任务,那没问题。如果我要撤回一项任务并想知道相关项目或机会的名称,我不能。我无法知道相关的 fkey 是项目还是机会。将来我可能会有其他具有任务关系的表;虽然我现在有 2 张桌子,但将来可能会有更多。

以下是我迄今为止想到的可能的解决方案:1)为每对单独的外部参照表(例如task_project_xref,task_opportunity_xref ...) 缺点:我必须为每个外部参照表运行查询以查找任务的关系

2) task_xref 中的第三列指向父表 缺点:这对我来说似乎是一个杂物

3)以可识别的方式(例如 proj1、proj2、proj3、opp1、opp2、opp3)将主键存储在项目、机会中,这样我就可以通过查看 fkey 缺点来判断任务与哪个表相关:这感觉就像我' m 使项目和机会中的主键变得神奇,赋予它们更多的意义,而不仅仅是作为单个记录的标识符(也许我想多了)

那么我的问题是:还有其他我忽略的解决方案吗?哪种解决方案比其他解决方案更好/更差?

如果可能的话,我会尽量保持连接限制和性能尽可能好。如果这有助于简化事情,我也不反对在代码中加入数据。

我正在使用 PHP 和 MySQL(目前是 MyISAM 表,但如果有理由会使用 INNODB)。

4

2 回答 2

0

如果 task_xref 有单独的 project_id 和 opportunity_id 字段,您的 SQL 连接会更整洁。这是一个很好的方法,因为查询很简单。此外,通过简单地查看哪些外键不为空,就很容易判断它是什么类型的任务。它也很有效。加入任务时,需要两个查询,因为项目和机会无疑会有不同的结构,所以结果union无论如何都不能'd。

于 2011-05-15T02:01:52.273 回答
0

我更喜欢为不同的概念使用单独的外部参照表。这样,从一个概念到其任务的关系更容易维护,并且与另一个概念与任务的关系隔离开来。

如果您的设计中的任何表都可以有任务,我可能会支持所有相关概念的单个外部参照,然后我只需要一个额外的列来指示哪种对象是任务的父级。

于 2011-05-15T03:14:11.273 回答