我创建了一个数据库,其中我有一个可以与项目,生产或性能相关联的人工制品。我将称之为'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时,它可能会导致问题。
答案 0 :(得分:1)
你的解决方案很好," come_from_table" column可以是用作鉴别器字段的简单VARCHAR或INT索引字段。但是,我会删除" come_from"来自" artefact"的列表和" come_from_id"列并直接使用" artefact_id"用于引用关系表中的人工制品的列。
关于Doctrine,不应该有任何问题,我过去使用Symfony2和Doctrine2为类似标签的实体做了类似的事情,其中Tag可以属于联系人或联系人。我还在存储库文件中创建了一个函数,我可以在其中传递" tag_type"作为参数,以便我可以获得联系人或联系人配偶标签。