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

2024-04-15

我有一个任务表,

 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)列,并且不希望在更改任务状态时也更新所有其他表。

我对此有两个问题。

  1. 有两个双射行-行对应的表是一个好习惯吗?
  2. 有没有一种方法可以确保约束中只有一行state表中的每一行对应task table?

我使用的系统是postgresql.


您可以通过将每个表中的 id 设为主键和引用另一个表中的 id 的外键来确保一一对应。这是允许的,并且可以保证 1-1 的比分。

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

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拥有两个具有双射行对应关系的 SQL 表是一个好习惯吗? 的相关文章

  • 将上一行值减去当前行

    我有下表 id value acc no 1 12 1 2 14 1 3 15 1 4 10 2 5 16 2 6 19 1 7 7 3 8 24 2 预期产出 id value acc no result 1 12 1 12 curren
  • 通过 Liquibase 从 SQL 脚本创建函数

    项目配置 数据库 MySQL 5 7 orm Hibernate 4 3 11 Final JPA 1 3 1 RELEASE 液体库 3 4 2 当我仅从 Liquibase 从 workBeanch 运行脚本时 我的问题不存在
  • 使用动态 SQL 检索表结构

    我正在迁移数据库 并尝试将表结构信息检索到单个行项目中以进行机器处理 由于技术原因 现有的迁移工具无法使用 必须采用这种方式处理 我已在多个表上成功运行以下查询 SELECT LISTAGG column name data type da
  • PostGIS - 将多多边形转换为单多边形

    是否可以将包含多个多边形的形状文件导入到 PostGIS 中的单个多边形中 每当我尝试导入多边形的形状文件时 它都会作为多多边形 而不是单个多边形 存储在geom柱子 因此 我无法从多重多边形中将其提取为单个多边形值 非常感谢所有有用的建议
  • PostgreSQL 中列名包含冒号的问题

    我从 OSM 下载了形状数据 我已将数据从 Shapefile 导入到 PostgreSQL 没有任何问题 但在执行 select 语句时出现错误 Select addr city From location Error syntax er
  • C# 和 .NET 的“最佳”数据访问框架/方法是什么?

    编辑 我将其设为社区维基 因为它更适合协作格式 有多种方法可以从 NET 访问 SQL Server 和其他数据库 一切都有其优点和缺点 这永远不会是一个简单的问题 哪个是 最好的 答案永远是 这取决于 然而 我正在寻找在不同级别的系统背景
  • 选择不同的字段和行号只是为了显示 ID 号会产生重复的数据

    我有一个表应用程序 它有 10 列 类别是一列 并且该列有重复值 为了获得不同的值 我有一个查询 SELECT distinct CATEGORY as CategoryName FROM APPLICATION where applica
  • Rails Heroku 应用程序错误

    我的项目在本地运行良好 我将它部署到 Heroku 我遇到了一些错误 应用程序无法在那里运行 我正在使用 Rails 4 和 postgresql 无法理解为什么会发生这种情况 在我看来 数据库没有创建 我应该在我的database yml
  • SQL原型设计:面对使用varchar(N)静默截断数据——有更好的选择吗? (天数据)

    情况 varchar 20 好像默默地截断在 Teradata 和not当遇到长度超过 20 个字符的字符串时扩展或抱怨 这有点令人惊讶 因为我预计列会自动扩展以适应更大的字符串 例如 30 个字符 或者如果更大的字符串会抛出错误遇到字符串
  • 带有多表查询的 SQL Join 版本的 Djangoviews.py

    需要一些有关 Django 版本的 SQL 多表查询的帮助 该查询使用 3 个表来检索餐厅名称 地址Restaurants table和美食类型来自Cuisinetypes table 所有这些都基于通过 URL 传递的菜品名称 菜品 ID
  • 如何找到与日期范围最重叠的时间段

    假设您有一个包含标识符 开始时间和结束时间的表 这些开始和结束时间可以是任意时间长度 开始时间始终早于结束时间 假设没有空值 什么样的查询会告诉我最 流行 的时间 即每行中的两个范围与大多数其他行重叠的位置 它的实际应用是它是一个记录用户登
  • MYSQL枚举:@rownum,奇偶记录

    我问了一个关于为查询结果创建临时 虚拟 ID 的问题 mysql 和 php 查询结果的临时 虚拟 ID https stackoverflow com questions 4063998 mysql php temporary virtu
  • Postgres:将列聚合到数组中

    我有以下两个表 select from list list id name 9 Popular 11 Recommended and select from list item list id game id position 11 2 0
  • mySQL中外键必须是索引吗?

    我刚刚自己创建了第一个 mySQL 表 除了使用 Joomla Wordpress 等 我是 MS SQL 开发人员多年 但通常我可以轻松地在 MS SQL 中创建外键 但我遇到了困难或这里缺乏知识 这是我的表格 users user id
  • PostgreSQL 逻辑复制 - 创建订阅挂起

    我正在尝试在 Debian 9 和 PG 11 1 的 2 个云实例之间设置逻辑复制 命令CREATE PUBLICATION在 master 上成功了 但是当我启动命令时CREATE SUBSCRIPTION在预期的逻辑副本上 该命令无限
  • MySQL:如果该ip没有任何记录则插入

    I use INSERT INTO rating name user rating section ip VALUES name SESSION user rate section SERVER REMOTE ADDR 我想在 IF 语句中
  • SQL SELECT 在父亲 ID 组织树中查找循环引用?

    带有循环引用的 乐趣 假设我有一个表 ELEMENTS 其中包含元素的层次结构 由父 ID 建模 对于根来说 父亲 ID 字段为空 所有其他记录都有一个非空父 id 和 自动排序的 主键 ID 的父元素 例如 使用 SELECT FROM
  • 包含对 char(13) 不满意

    为什么不会SSMS为我处理这个脚本 DECLARE containsReturn AS CHAR 500 email protected cdn cgi l email protection email protected cdn cgi
  • 如何使用 pyodbc 和 MS-Access 在 Python Cursor.execute 中查看真实的 SQL 查询

    我在 Python 中使用以下代码 使用 pyodbc 作为 MS Access 基础 cursor execute select a from tbl where b and c x y 没关系 但是出于维护目的 我需要知道发送到数据库的
  • mysql JOIN,这是如何解释的?

    如果我为 mysql 编写一条 sql 查询 并且只指定 JOIN 没有外连接 内连接 左连接等 那么默认的连接类型是什么 例如 SELECT count FROM Students p JOIN 班级 c ON p studentId c

随机推荐