【发布时间】:2011-06-15 02:20:33
【问题描述】:
我们什么时候需要在数据库设计中使用一对一的关系?在我看来,如果两张表是一对一的关系,可以合并成一张表。这是真的吗?
【问题讨论】:
标签: database database-design erd
我们什么时候需要在数据库设计中使用一对一的关系?在我看来,如果两张表是一对一的关系,可以合并成一张表。这是真的吗?
【问题讨论】:
标签: database database-design erd
对大型表进行垂直分区以减少 I/O 和缓存要求 - 将经常查询与很少查询的单独列分开。
当alter table“太贵”时向生产系统添加列。
垂直分区从表(连接)消除中受益——提供优化器 支持它(再次减少 I/O 和缓存)。
Anchor modeling -- 类似于 4,但低于 6NF。
【讨论】:
有时它对表锁很有用。当您向数据库添加一列时,整个表将被锁定,直到它被完全重写。当您的数据库有 100k 行时,这几乎没有影响。但如果你有 100M 行或 1B 行,那就完全不同了...
避免占用太多空间的死行也很有用。如果您使用MVCC 并且您的某些列经常被覆盖,则有时将它们放在单独的表中是有意义的。可以说,自动清理最终会起作用,但为了节省硬盘驱动器的工作,最好清理一个单独的表中的几个 int 字段,而不是一大堆充满文本的整行,varchar(n) 和谁知道还有什么。
最后一个原因是在 ORM 中滥用 select *。例如,如果您要存储图像或博客文章/文章,则将 blob/文本字段存储在单独的表中可能是有意义的。因为每次由于某种原因或其他原因被加载时,您的 ORM 都会加载整行。当您只需要图像或帖子的 URL 时,您最不想做的就是从数据库中提取整个二进制/文本;然而你的 ORM 会做到这一点......
【讨论】:
一般来说是的。
如果您想以不同方式为列的子集分配权限,则可能是一个例外。
还要考虑这只有在双方都需要时才成立。
【讨论】:
一个原因是将经常访问的数据放在一个表中,而将极少访问的数据放在另一个表中。它会运行得更快并节省一些内存。
但在我这样做之前,我必须让我的手臂用力扭动。
【讨论】: