我很难确定何时在db设计中使用1对1关系,或者是否有必要.

如果您只能 Select 查询中需要的列,那么是否有必要将表拆分成一对一的关系.我猜更新大表比更新小表对性能的影响更大,我确信这取决于表在某些操作(读/写)中的使用率

那么,在设计数据库模式时,如何考虑一对一关系呢?你用什么标准来确定你是否需要一个,不使用有什么好处?

推荐答案

从逻辑的Angular 来看,1:1的关系应该总是合并到一个表中.

另一方面,对于这样的"vertical partitioning"或"行拆分",可能有physical个注意事项,尤其是如果您知道访问某些列的频率更高,或者访问方式与其他列不同,例如:

  • 您可能希望以不同方式将1:1关系的两个"端点"表设置为clusterpartition.
  • 如果您的DBMS允许,您可能希望将它们放在不同的物理磁盘上(例如,SSD上的性能更为关键,而另一个则放在廉价的硬盘上).
  • 您已经测量了对缓存的影响,希望确保"热"列保留在缓存中,而"冷"列不会"污染"缓存.
  • 您需要一个比整行"窄"的并发行为(如锁定).这是高度特定于DBMS的.
  • 不同的列需要不同的安全性,但DBMS不支持列级权限.
  • 触发器通常是特定于表的.虽然理论上您可以只有一个表,并且让触发器忽略行的"错误的那一半",但是一些数据库可能会对触发器可以和不能做的事情施加额外的限制.例如,Oracle不允许您从行级触发器修改所谓的"变异"表-通过使用单独的表,它们中只有一个可能会发生变异,因此您仍然可以从触发器修改另一个表(但有other ways个表需要解决).

数据库非常擅长处理数据,所以我不会仅仅为了更新性能而拆分表,unless您已经对代表性的数据量执行了实际基准测试,并得出结论,性能差异确实存在并且足够显著(例如,抵消了加入的需求增加).


另一方面,如果您谈论的是"1:0或1"(而不是真正的1:1),这是一个完全不同的问题,应该得到不同的答案……

另见:When I should use one to one relationship?

Database相关问答推荐

如何调试Anylogic SQL数据库TLS错误?

如何在 N1QL 查询(Couchbase 查询)中使用 LENGTH() 字符串函数

文件存储的推荐位置 - 在数据库或其他什么地方?

如何在 C# 控制台应用程序中执行 CMD 命令?

发布 Oracle 和 SQL Server 性能测试是否违反许可?

数据库中的每个表都应该有一个 SQLiteOpenHelper 吗?

为什么引用 SQLite rowid 会导致外键不匹配?

仅对表中的一列授予更改

Oracle SQL 开发人员中的 DB2 数据库

关闭连接会自动关闭语句和结果集吗?

设计数据库时最重要的考虑因素是什么?

在 SQL SERVER 中监视 SQL 查询的进度

您如何在数据库中构造配置数据?

PostgreSQL 字符变长限制

如何在 PDO 中获取数据库名称?

JPA:处理 OptimisticLockException 的模式

如何在实体-属性-值设计中处理不同的数据类型(例如,具有多列的单个表或每种数据类型的多个表)?

没有自动增量的sqlalchemy主键

是否有任何支持协议缓冲区的数据库?

如何使用 liquibase,一个具体的例子