我有一个任务表,
id | name
----+-------------
1 | brush teeth
2 | do laundry
和状态表。
taskid | state
--------+-------------
1 | completed
2 | uncompleted
表之间存在双射对应关系,即
中的每一行task
表恰好对应于中的一行state
table.
实现这一点的另一种方法是放置一个state
行在task
table.
id | name | state
----+-------------+-------------
1 | brush teeth | completed
2 | do laundry | uncompleted
我选择使用两个表而不是这个表的主要原因是因为更新state
然后会导致任务发生变化id
。
我还有其他表格引用task(id)
列,并且不希望在更改任务状态时也更新所有其他表。
我对此有两个问题。
- 有两个双射行-行对应的表是一个好习惯吗?
- 有没有一种方法可以确保约束中只有一行
state
表中的每一行对应task
table?
我使用的系统是postgresql
.
您可以通过将每个表中的 id 设为主键和引用另一个表中的 id 的外键来确保一一对应。这是允许的,并且可以保证 1-1 的比分。
有时,您需要这样的表,但一个表的行数少于另一个表的行数。当存在子集关系并且您不希望所有行上都有附加列时,就会发生这种情况。
另一个目的是在不同的地方存储单独的列。当我了解数据库时,这种方法被称为垂直分区。现在列式数据库比较常见;这些将这个概念发挥到了极致——每列都有一个单独的“存储”(尽管“存储”并不完全是一个“表”)。
你为什么要这样做?以下是一些原因:
- 您不希望为频繁使用的列上的每个查询加载不常用的列。
- 您经常更新列,并且不想锁定其余列。
- 您的列太多,无法存储在一行中。
- 您对不同的列有不同的安全要求。
Postgres 确实提供了您可能会发现相关的其他机制。特别是,表继承在您的情况下可能很有用。
尽管如此,您通常不会设计这样的数据库。这样做有充分的理由,但更典型的做法是将与实体相关的所有列放在同一个表中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)