如何解决三通态关联?(How can I resolve a three-way polymorph

2019-08-17 07:48发布

首先我要说,我使用MySQL(不是事务),而这不能改变。 另外,我在这里简单的表为简洁和清晰。

在该示例中“课程”是由它的内部属性,并用它自己的属性“解读”外部属性。 “解读”有它自己的核心相关的属性和三种不同的外部属性(读取源)。

我想避免的多态关联,在这里边棱,但我不能环绕它我的头。 在这个例子中表“读”的sourceID“将包含三个表“ExternalURL”,“InternalURL”和“尚书”中的一个ID。 此外,本场“polytable”将包含上述“ID”是从哪里来的表名。

有人可以花点时间解释一下如何解决这个维护RI或是否有可能在效率的利益,它应该留?

感谢您的时间和考虑,

蒂姆

                       -------------
                      | ExternalURL |
                       -------------
                      | id          |
                      | badlink     |
                      | url         |
                      |             |
                      |             |
                       -------------
                            |
                            |
                            |
                           / \
 ------------          -------------          -------------
| Lesson     |-------<| Reading     |>-------| InternalURL |
 ------------          -------------          -------------
| id         |        | id          |        | id          |
| label      |        | lessonId    |        | url         |
| summary    |        | sourceId    |        |             |
| lessonOrder|        | polytable   |        |             |
| active     |        | label       |        |             |
 ------------          -------------          -------------
                            \ /
                             |
                             |
                       ------------  
                      | Book       |
                       ------------ 
                      | id         |
                      | label      |
                      | summary    |
                      | lessonOrder|
                      | active     |
                       ------------ 

Answer 1:

你至少有几个选项来保存RI:

  1. 在添加几个可为空FK列Reading ,每个阅读类型。 只有这些人应该非空。

     CREATE TABLE Reading ( id INT AUTO_INCREMENT PRIMARY KEY, lessonId INT NOT NULL, bookId INT NULL, externalUrlId INT NULL, internalUrlId INT NULL, FOREIGN KEY (bookId) REFERENCES Book(id), FOREIGN KEY (externalUrlId) REFERENCES ExternalUrl(id), FOREIGN KEY (internalUrlId) REFERENCES InternalUrl(id) ); 

    强制执行外键列的恰好是一个非空是一个任务触发 ,否则你就必须这样做,在应用程序代码。 但至少你可以定义外键。

  2. 添加超表Readable这是每个其他特定可读类型的父。

     CREATE TABLE Readable ( id INT AUTO_INCREMENT PRIMARY KEY, readable_type CHAR(1) NOT NULL, UNIQUE KEY (id, readable_type) ); CREATE TABLE Book ( id INT PRIMARY KEY, -- not AUTO_INCREMENT readable_type CHAR(1) NOT NULL, -- must be 'B' FOREIGN KEY (id, readable_type) REFERENCES Readable(id, readable_type) ); ... similar tables for ExternalUrl and InternalUrl... 

    然后,让阅读也引用可读。

     CREATE TABLE Reading ( id INT AUTO_INCREMENT PRIMARY KEY, lessonId INT NOT NULL, sourceId INT NOT NULL, FOREIGN KEY (sourceId) REFERENCES Readable(id) ); 

    我将详细介绍该解决方案在我回答你为什么不能在一个多态关联的外键? 。



文章来源: How can I resolve a three-way polymorphic association?