Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
拥有两个具有双射行对应关系的SQL表是一种好的做法吗?_Sql_Postgresql - Fatal编程技术网

拥有两个具有双射行对应关系的SQL表是一种好的做法吗?

拥有两个具有双射行对应关系的SQL表是一种好的做法吗?,sql,postgresql,Sql,Postgresql,我有一张任务表 id | name ----+------------- 1 | brush teeth 2 | do laundry 还有一张州表 taskid | state --------+------------- 1 | completed 2 | uncompleted 表之间存在双射对应,即。 任务表中的每一行恰好对应于状态表中的一行 另一种实现方法是在任务表中放置状态行 我选择使用两个表而不是这个表的主要原因是更新状态会导致任务id发生变

我有一张任务表

 id | name
----+-------------
 1  | brush teeth
 2  | do laundry
还有一张州表

 taskid | state
--------+-------------
 1      | completed
 2      | uncompleted
表之间存在双射对应,即。 任务表中的每一行恰好对应于状态表中的一行

另一种实现方法是在任务表中放置状态行

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

关于这一点,我有两个问题

在双射行对应中有两个表是好的做法吗? 是否有一种方法可以确保状态表中正好有一行对应于任务表中的每一行?
我使用的系统是postgresql。

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

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

另一个目的是在不同的地方存储单独的列。当我了解数据库时,这种方法被称为垂直分区。如今,柱状数据库比较常见;这些方法将这一概念发挥到了极致——为每一列单独存储,尽管存储并不完全是一个表

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

您不希望为更频繁列上的每个查询加载不经常使用的列。 您经常更新列,不想锁定其余列。 一行中存储的列太多。 您对不同的列有不同的安全要求。 Postgres确实提供了您可能会觉得相关的其他机制。特别是,表继承在您的情况下可能很有用

尽管如此,您通常不会设计这样的数据库。这样做有很好的理由,但更典型的做法是将与实体相关的所有列放在同一个表中

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