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

时间:2018-02-24 16:13:34

标签: sql postgresql

我有一个任务表,

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

和状态表。

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

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

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

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

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

我有两个问题。

  1. 在双向行 - 行对应中有两张表是好的做法吗?
  2. 有没有办法可以确保约束state表中只有一行对应task表中的每一行?
  3. 我使用的系统是postgresql

1 个答案:

答案 0 :(得分:4)

您可以通过使每个表中的id成为主键和引用另一个表中的id的外键来确保1-1对应关系。这是允许的,它保证了1-1。

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

另一个目的是在不同的地方存储单独的列。当我了解数据库时,这种方法被称为垂直分区。如今,柱状数据库相对常见;这些将概念推向了极致 - 一个单独的商店"对于每一列(尽管"商店"不完全是"表")。

你为什么要这样做?以下是一些原因:

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

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

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

相关问题