与不同表格相同关系的一对一关系

时间:2014-08-09 14:04:18

标签: mysql sql database doctrine-orm mysql-workbench

我创建了一个数据库,其中我有一个可以与项目,生产或性能相关联的人工制品。我将称之为'come_from'的关系。这种关系可以是项目,也可以是项目的更具体版本,例如生产或绩效。

我不想在我的人工制品上为'come_from'关系的每个可能值设置单独的外键,因为对于同一关系有多个属性感觉不对。我能想到的唯一方法是使用一个单独的表来存储come_from关系,该关系包含引用项目的id或更具体的版本以及项目所在的表。

artefact table
+-------------+------------+
| artefact_id | comes_from | -- Foreign key to comes_from
+-------------+------------+
| 1           | 7          |
| 2           | 8          |
+-------------+------------+

comes_from table
+---------------+-----------------+---------------------------------+
| comes_from_id | comes_from (FK) | comes_from_table (FK table)     |
+---------------+-----------------+---------------------------------+
| 7             | 19              | project                         |
| 8             | 13              | performance                     |
| 9             | 21              | production                      |
+---------------+-----------------+---------------------------------+

project table
+-------------+
| project_id  |
+-------------+
| 19          |
| 20          |
+-------------+

performance table
+-----------------+
| performance_id  |
+-----------------+
| 13              |
| 14              |
+-----------------+

production table
+---------------+
| production_id |
+---------------+
| 21            |
| 22            |
+---------------+

有没有更好的方法来执行此操作,因为我不确定我甚至可以在SQL查询中解决此关系,并且当我将Doctrine用作此数据库之上的ORM时,它可能会导致问题。

1 个答案:

答案 0 :(得分:1)

你的解决方案很好," come_from_table" column可以是用作鉴别器字段的简单VARCHAR或INT索引字段。但是,我会删除" come_from"来自" artefact"的列表和" come_from_id"列并直接使用" artefact_id"用于引用关系表中的人工制品的列。

关于Doctrine,不应该有任何问题,我过去使用Symfony2和Doctrine2为类似标签的实体做了类似的事情,其中​​Tag可以属于联系人或联系人。我还在存储库文件中创建了一个函数,我可以在其中传递" tag_type"作为参数,以便我可以获得联系人或联系人配偶标签。