English 中文(简体)
为什么在多吗?
原标题:
  • 时间:2009-05-28 17:32:39
  •  标签:

为什么你在多形态协会中没有外国钥匙,例如作为铁路模式的下述协会?

class Comment < ActiveRecord::Base
  belongs_to :commentable, :polymorphic => true
end

class Article < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

class Photo < ActiveRecord::Base
  has_many :comments, :as => :commentable
  #...
end

class Event < ActiveRecord::Base
  has_many :comments, :as => :commentable
end
最佳回答

外国关键人物必须只参考一张母桌。 这一点对于Kumyntax和关系理论都至关重要。

整体形态协会是指某一栏可以参考两个或两个以上母系。 您无法宣称,在“结构”中存在着这种限制。

多形态协会的设计打破了关系数据库设计的规则。 我不建议使用。

有几个备选办法:

  • <>光印章> 建立多个外国关键栏目,每个栏目指一名家长。 强制实施这些外国钥匙中完全可以是非民族解放军。

  • www.un.org/Depts/DGACM/index_spanish.htm 更改关系: 使用了三张多面表格、每张参考书和一张相应的母。

  • http://www.hchr.org。 与其说是暗含的“可加工”超级阶级,就形成了一个真实的表格,表明你们的每个表次都提到了这一点。 然后,你的评论与这个超级大国联系起来。 伪铁路法与以下法一样(不使用铁路,因此将其作为一条准则而不是字面法处理):

     class Commentable < ActiveRecord::Base
       has_many :comments
     end
    
     class Comment < ActiveRecord::Base
       belongs_to :commentable
     end
    
     class Article < ActiveRecord::Base
       belongs_to :commentable
     end
    
     class Photo < ActiveRecord::Base
       belongs_to :commentable
     end
    
     class Event < ActiveRecord::Base
       belongs_to :commentable
     end
    

我在发言;http://www.slidecomm.net/billkarwin/practical-object-models-in-sql” rel=“nofollow noreferer”>Practical Object-Oriented Models in Luc/a>;我的书记


评论: 是的,我确实知道,还有一栏注明了该表的名称,而该表是外国的关键。 这一设计没有外国钥匙的支持。

例如,如果你将“Video”改为“Video”号母表的名称,会发生什么情况。 评论。 没有一个名为“Video”的表格。 是否应当用错误加以分类? 哪些限制被违反? 房舍管理事务所知道,这一栏应指明现有表格吗? 如何处理对案件敏感的表格名称?

同样,如果您放弃<代码>Events table,但您在Comments上有行文表示 作为其父母的事件,结果如何? 退学表是否应当流产? <代码>Comments中的行文是否成为孤儿? 这些改动是否应当提到另一个现有表格,例如<条码>。 用于指<条码>的正值/代码>在注明<条码>时是否具有意义?

之所以出现这些困境,是因为多形态协会依靠数据(即直观价值)来指元数据(表格名称)。 这一点没有得到SQ的支持。 数据和元数据是分开的。


我花了很强的时间,围绕你的“联合监督”建议总结我的头脑。

  • 定义<代码>Commentable,作为真正的表格,而不仅仅是在你的铁路模型定义中的形容词。 无需其他栏目。

     CREATE TABLE Commentable (
       id INT AUTO_INCREMENT PRIMARY KEY
     ) TYPE=InnoDB;
    
  • 表格Articles,Photos Event作为Commentable的“子类别”,将其主要钥匙作为外国关键参考资料Commentable

     CREATE TABLE Articles (
       id INT PRIMARY KEY, -- not auto-increment
       FOREIGN KEY (id) REFERENCES Commentable(id)
     ) TYPE=InnoDB;
    
     -- similar for Photos and Events.
    
  • 定义<代码>Comments table with a foreign key to Commentable

     CREATE TABLE Comments (
       id INT PRIMARY KEY AUTO_INCREMENT,
       commentable_id INT NOT NULL,
       FOREIGN KEY (commentable_id) REFERENCES Commentable(id)
     ) TYPE=InnoDB;
    
  • 如你想建立<条码>,<>条/代码>(例如),你也必须在<条码>上建立一个新行。

     INSERT INTO Commentable (id) VALUES (DEFAULT); -- generate a new id 1
     INSERT INTO Articles (id, ...) VALUES ( LAST_INSERT_ID(), ... );
    
     INSERT INTO Commentable (id) VALUES (DEFAULT); -- generate a new id 2
     INSERT INTO Photos (id, ...) VALUES ( LAST_INSERT_ID(), ... );
    
     INSERT INTO Commentable (id) VALUES (DEFAULT); -- generate a new id 3
     INSERT INTO Events (id, ...) VALUES ( LAST_INSERT_ID(), ... );
    
  • 当你想创建<条码>Comment时,使用<条码>所载数值。

     INSERT INTO Comments (id, commentable_id, ...)
     VALUES (DEFAULT, 2, ...);
    
  • 当你想询问某一个特定<代码>标准

     SELECT * FROM Photos p JOIN Commentable t ON (p.id = t.id)
     LEFT OUTER JOIN Comments c ON (t.id = c.commentable_id)
     WHERE p.id = 2;
    
  • 如果你只收到评论,而且你想找到什么值得评论的资源,那么你会提出评论。 为此,你可能认为,指定哪一个参考表格是有益的。

     SELECT commentable_id, commentable_type FROM Commentable t
     JOIN Comments c ON (t.id = c.commentable_id)
     WHERE c.id = 42;
    

然后,在从<代码>可计量的<> 类型中发现数据后,需要再进行第二次查询,以便从相应的资源表获取数据。 你可以在同一个问询中这样做,因为LQ要求明确列出表格;你可以加入由同一询问中的数据结果确定的表格。

诚然,其中一些步骤违反了铁路公约。 但是,铁路公约在适当的关系数据库设计方面是错误的。

问题回答

第Karwin号法案是正确的,因为没有真正具有本土的多形态关系,因此不能使用外国钥匙与多形态关系。 但是,如果你具有外国钥匙的目标是强制执行参考性完整性,那么你可以通过触发器加以模拟。 下面是一些近期的触发因素,这些触发因素是为了模拟一种外国钥匙在多变关系上的 delete切行为:

CREATE FUNCTION delete_related_brokerage_subscribers() RETURNS trigger AS $$
  BEGIN
    DELETE FROM subscribers
    WHERE referrer_type =  Brokerage  AND referrer_id = OLD.id;
    RETURN NULL;
  END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER cascade_brokerage_subscriber_delete
AFTER DELETE ON brokerages
FOR EACH ROW EXECUTE PROCEDURE delete_related_brokerage_subscribers();


CREATE FUNCTION delete_related_agent_subscribers() RETURNS trigger AS $$
  BEGIN
    DELETE FROM subscribers
    WHERE referrer_type =  Agent  AND referrer_id = OLD.id;
    RETURN NULL;
  END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER cascade_agent_subscriber_delete
AFTER DELETE ON agents
FOR EACH ROW EXECUTE PROCEDURE delete_related_agent_subscribers();

在我的代码中,<条码>打字机表格中的记录或<条码>中的记录可与<条码/代码>表中的记录有关。

让我说,你想在Kingk建立同样的制度。 在多形态协会中,你与这些栏目建立了联接模型:

id_of_like    user_id     liked_id   liked_type
  1            12          3          image
  2            3           5          video

引自图像或录像。

通常,在你创建桌子时,你就设置了<条码>外国钥匙/<代码>,并标出将这一外国关键参考书表的K.数据库。 在您插入行文之前,您的数据库将检查目前外国关键价值是否有效。 例如,如果在外国关键参考资料表上显示美国ER,则贵国数据库将检查美国ER表是否存在当前外国关键人物。 这项核查确保了你的数据库的一致性。

让我在上述表格中说,我们有点将<代码>,如<>d_id>/code>作为签名KEY,数据库将如何知道哪一个表格(IMAGE或VIDEO)访问以验证目前的关键价值? <打字栏/代码>不要求数据库管理员阅读,数据库管理员不读到哪张表格。

Imagine I 插入一个新行,有<条码>,类似于_id=333。

id_of_like    user_id     liked_id   liked_type
  1            12          333333     image

如果在IMAGE表格中存在<代码>id=333<<>>>/code>,贵国数据库管理人将无法证实。





相关问题
热门标签