6

我们什么时候需要在数据库设计中使用一对一的关系?在我看来,如果两张表是一对一的关系,可以合并成一张表。这是真的?

4

4 回答 4

10
  1. 大型表的垂直分区以减少 I/O 和缓存要求——将经常查询与很少查询的列分开。

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

  3. 超类型/子类型模式。

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

  5. 锚定建模——类似于 4,但低至6NF

于 2011-06-15T18:31:29.870 回答
1

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

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

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

于 2011-06-15T02:31:51.887 回答
0

一般来说是的。

如果您想以不同的方式将权限分配给列的子集,则可能是一个例外。

还要考虑这只有在双方都需要时才成立。

于 2011-06-15T02:23:31.457 回答
0

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

但在我这样做之前,我必须让我的手臂用力扭动。

于 2011-06-15T02:25:19.583 回答