admin

拥有两个具有双列行对应关系的SQL表是一种好习惯吗?

sql

我有一张任务表,

 id | name
----+-------------
 1  | brush teeth
 2  | do laundry

和状态表。

 taskid | state
--------+-------------
 1      | completed
 2      | uncompleted

表之间存在双射对应关系,即表中的每一行都task恰好对应于state表中的一行。

实现此目的的另一种方法是statetask表中放置一行。

 id | name        | state
----+-------------+-------------
 1  | brush teeth | completed
 2  | do laundry  | uncompleted

我选择使用两个表而不是一个表的主要原因是因为更新state会导致任务更改id。我还有其他表引用该task(id)列,并且不想在更改任务状态时也必须更新所有其他表。

我对此有两个问题。

  1. 在双射行与行的对应关系中有两个表是一种好习惯吗?
  2. 有没有一种方法可以确保约束,使得state表中恰好有一行与表中的每一行相对应task

我正在使用的系统是postgresql


阅读 146

收藏
2021-06-07

共1个答案

admin

您可以通过将每个表中的id用作主键和引用另一个表中的id的外键来确保1-1对应。这是允许的,并且保证1-1’。

有时,您需要这样的表,但是一个表的行数要少于另一个表。当存在子集关系并且您不希望所有行上都有其他列时,会发生这种情况。

另一个目的是将单独的列存储在不同的位置。当我了解数据库时,这种方法称为 垂直分区
。如今,柱状数据库相对普遍。这些将概念带到了极致–每列都有一个单独的“存储”(尽管“存储”并不完全是“表”)。

你为什么要这样做?原因如下:

  • 您不经常使用的列不想在较频繁的列上为每个查询加载。
  • 您具有经常更新的列,并且不想锁定其余的列。
  • 您有太多列无法存储在一行中。
  • 您在不同的列上有不同的安全要求。

Postgres确实提供了其他可能与您相关的机制。特别地,表继承在您的情况下可能很有用。

所有这些,您通常不会设计这样的数据库。这样做有充分的理由,但是更常见的是将与实体相关的所有列都放在同一张表中。

2021-06-07