gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:58:30 25 4
gpt4 key购买 nike

我有一个任务表,

 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中每一行对应的表表?

我使用的系统是postgresql .

最佳答案

可以通过将每张表中的id作为主键和引用另一张表中id的外键来保证1-1对应。这是允许的,它保证 1-1'ness。

有时,您需要这样的表格,但一张表格的行数少于另一张。当存在子集关系并且您不希望所有行上都有额外的列时,就会发生这种情况。

另一个目的是在不同的地方存储单独的列。当我了解数据库时,这种方法称为垂直分区。现在,列式数据库比较普遍;这些将概念发挥到了极致——每一列都有一个单独的“存储”(尽管“存储”不完全是一个“表”)。

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

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

Postgres 确实提供了您可能会发现相关的其他机制。特别是,表继承可能对您的情况有用。

综上所述,您通常不会设计这样的数据库。这样做有充分的理由,但更典型的做法是将与实体相关的所有列放在同一个表中。

关于sql - 有两个具有双射行对应关系的 SQL 表是好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48964851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com