这就是我现在所处的位置。我有四个表: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)。