数据库复合键与域键/范式的深入解析
1. 数据不一致问题引出复合键
在数据库操作中,我们可能会遇到数据不一致的情况。例如,有一场电影放映时间显示在名为“Stellar Theatre”的剧院,但实际上对应的礼堂“B”却在“Old Towne Theatre”。尽管从外键引用和Rails关联来看,这是有效的,但显然不符合实际逻辑。这表明我们虽然认为确保了引用完整性,但仍允许了无效数据进入系统。
# 示例代码展示数据不一致情况
>> t = Theatre.find_by_name('Steller Theatre')
>> puts t.movie_showtimes.first.auditorium.theatre.name
=> "Old Towne Theatre"
出现这种情况的原因并非引用错误,而是主键设置不合理。 id 列有时无法提供足够信息来确保多个表之间关系的引用完整性,这时复合键就派上用场了。
2. 复合键的识别与自然键
复合键是由多个列组成的键。要确定复合键,可先考察主键的特性,主键必须对所有记录唯一。如果现实场景中一组列存在唯一性约束,那么在数据模型里,这些列很可能就是复合键的合适候选。当主键基于数据的属性使其与其他数据区分开来时,这种键被称为自然键。
以 auditoriums 表为例, (theatre_id, room) 列存在唯一约束。一个剧院不可能有两个名为“A”的礼堂,这种唯一列组合不仅能清晰
超级会员免费看
订阅专栏 解锁全文
110

被折叠的 条评论
为什么被折叠?



