2

如果你有

Parent
 has_many :children

Child

是否有任何理由belongs_to :parent不希望在子项(对父项)和相应项上使用外键?

什么时候,如果有的话,你不希望你的孩子能够访问它的父母吗?

4

2 回答 2

4

这是一个权衡。反对外键的通常论点是外键的索引在插入/更新/删除时会产生一些性能开销。 就像任何索引一样。

但是,当您通过该列进行搜索时,索引也会带来很大的好处。

SELECT * FROM Child WHERE parent_id = :id 

也不要低估搜索孤儿和清理 bollixed 引用的开销,这是省略外键约束的必然结果。

-- Typical chore: searching for orphaned child rows.

SELECT c.* FROM Child c LEFT OUTER JOIN Parent p 
  ON (c.parent_id = p.parent_id) 
WHERE p.parent_id IS NULL;

还有一些数据库设计不能使用外键,例如多态关联或实体-属性-值。但这些设计本身就是反模式。

于 2009-05-28T17:02:39.943 回答
1

表现。插入子记录以确定是否存在父记录时会产生成本。您仍然可以访问父记录(假设您在子表中有一个 parentID 列,只是没有参照完整性)。

于 2009-05-28T16:41:33.980 回答