我有一张任务表,
id | name ----+------------- 1 | brush teeth 2 | do laundry
和状态表。
taskid | state --------+------------- 1 | completed 2 | uncompleted
表之间存在双射对应关系,即表中的每一行都task恰好对应于state表中的一行。
task
state
实现此目的的另一种方法是state在task表中放置一行。
id | name | state ----+-------------+------------- 1 | brush teeth | completed 2 | do laundry | uncompleted
我选择使用两个表而不是一个表的主要原因是因为更新state会导致任务更改id。我还有其他表引用该task(id)列,并且不想在更改任务状态时也必须更新所有其他表。
id
task(id)
我对此有两个问题。
我正在使用的系统是postgresql。
postgresql
您可以通过将每个表中的id用作主键和引用另一个表中的id的外键来确保1-1对应。这是允许的,并且保证1-1’。
有时,您需要这样的表,但是一个表的行数要少于另一个表。当存在子集关系并且您不希望所有行上都有其他列时,会发生这种情况。
另一个目的是将单独的列存储在不同的位置。当我了解数据库时,这种方法称为 垂直分区 。如今,柱状数据库相对普遍。这些将概念带到了极致–每列都有一个单独的“存储”(尽管“存储”并不完全是“表”)。
你为什么要这样做?原因如下:
Postgres确实提供了其他可能与您相关的机制。特别地,表继承在您的情况下可能很有用。
所有这些,您通常不会设计这样的数据库。这样做有充分的理由,但是更常见的是将与实体相关的所有列都放在同一张表中。