如果你有
Parent
has_many :children
Child
是否有任何理由belongs_to :parent
不希望在子项(对父项)和相应项上使用外键?
什么时候,如果有的话,你不希望你的孩子能够访问它的父母吗?
如果你有
Parent
has_many :children
Child
是否有任何理由belongs_to :parent
不希望在子项(对父项)和相应项上使用外键?
什么时候,如果有的话,你不希望你的孩子能够访问它的父母吗?
这是一个权衡。反对外键的通常论点是外键的索引在插入/更新/删除时会产生一些性能开销。 就像任何索引一样。
但是,当您通过该列进行搜索时,索引也会带来很大的好处。
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;
还有一些数据库设计不能使用外键,例如多态关联或实体-属性-值。但这些设计本身就是反模式。
表现。插入子记录以确定是否存在父记录时会产生成本。您仍然可以访问父记录(假设您在子表中有一个 parentID 列,只是没有参照完整性)。