我有一个任务表,
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)
列,并且不希望在更改任务状态时也必须更新所有其他表。
我有两个问题。
state
表中只有一行对应task
表中的每一行? 我使用的系统是postgresql
。
答案 0 :(得分:4)
您可以通过使每个表中的id成为主键和引用另一个表中的id的外键来确保1-1对应关系。这是允许的,它保证了1-1。
有时,您需要这样的表,但是一个表的行数少于另一个表。当存在子集关系时,会发生这种情况,并且您不希望所有行都有其他列。
另一个目的是在不同的地方存储单独的列。当我了解数据库时,这种方法被称为垂直分区。如今,柱状数据库相对常见;这些将概念推向了极致 - 一个单独的商店"对于每一列(尽管"商店"不完全是"表")。
你为什么要这样做?以下是一些原因:
Postgres确实提供了您可能认为相关的其他机制。特别是,表继承在您的情况下可能很有用。
所有这一切,你通常不会设计这样的数据库。这样做有充分的理由,但更常见的是将与实体相关的所有列放在同一个表中。