当我们需要在数据库设计中使用一对一关系时?

时间:2011-06-15 02:20:34

标签: database database-design erd

我们何时需要在数据库设计中使用一对一的关系?在我看来,如果两个表是一对一的关系,它们可以组合成一个表。这是真的吗?

4 个答案:

答案 0 :(得分:10)

  1. 大型表的垂直分区以减少I / O和缓存需求 - 经常与很少查询的单独列。

  2. alter table“过于昂贵”时,将列添加到生产系统。

  3. Super-type/subtype 模式。

  4. 垂直分区以从表(连接)消除中受益 - 提供优化器 支持它(再次减少I / O和缓存)。

  5. Anchor modeling - 类似于4,但下至 6NF

答案 1 :(得分:1)

有时它对表锁很有用。将列添加到数据库时,整个表将被锁定,直到完全重写为止。当您的数据库有100k行时,这几乎没有影响。但如果你有100M行或1B行,那就完全不同了......

避免占用太多空间的死行也很有用。如果您使用MVCC并且某些列经常被覆盖,则将它们放在单独的表中通常是有意义的。可以说,自动吸尘最终会开始,但是为了节省硬盘驱动器的工作,更好地在一个单独的表中抽真空几个int字段,而不是整堆文本,varchar(n)以及谁知道还有什么。

最后一个原因是在ORM中滥用select *。例如,如果您要存储图像或博客文章/文章,则可以将blob / text字段存储在单独的表中。因为每次因某种原因而加载时,您的ORM将加载整行。当您只需要图像或帖子的URL时,您最不希望的是从数据库中提取整个二进制文本/文本;然而你的ORM会做到这一点...

答案 2 :(得分:0)

总的来说是的。

如果您希望以不同的方式为列的子集分配权限,则可能有一个例外。

也认为只有在需要双方时才会这样。

答案 3 :(得分:0)

一个原因是将频繁访问的数据放在一个表中,而极少访问的数据放在另一个表中。它会运行得更快并节省一些内存。

但在我这样做之前,我必须先扭伤我的手臂。