复合主键与附加“ID”列?

2023-11-24

如果我们有一个这样的表:

书籍(假装“ISBN”不存在)

  • Author
  • Title
  • Edition
  • 出版年份
  • Price

有人可能会说 {Author,Title,Edition} 可能是候选/主键。

是什么决定了候选/主键是否应该是 {Author,Title,Edition} 或者是否应该使用 ID 列,并且 {Author,Title,Edition} 是唯一索引/键约束?

So is

  • 作者(PK)
  • 标题(PK)
  • 版本(PK)
  • 出版年份
  • Price

更好,或者:

  • ID (PK)
  • Author
  • Title
  • Edition
  • 出版年份
  • Price

其中 {Author,Title,Edition} 是附加的唯一索引/约束?


比如说{Author, Title, Edition}唯一标识一本书,则以下成立:

  1. 它是一个超级键——唯一标识一个元组(行)。

  2. 它是不可约的——删除任何列都不会使其成为键。

  3. 它是一个候选键——不可约的超键是一个候选键。

现在让我们考虑 ID(整数)

我可以推断Book表键将作为外键显示在少数其他表中,并且也会显示在少数索引中。因此,在每个表以及匹配的索引中,将占用相当多的空间 - 比如说三列 x 40 个字符(或其他......)。

为了使这些“其他”表和索引更小,我可以向Book表用作将被作为外键引用的键。说这样的话:

alter table Book add BookID integer not null identity;

With BookID也(必须是)独特的,Book表现在有两个候选键。

现在我可以选择BookID作为主键。

alter table Book add constraint pk_Book primary key (BookID);

但是,那{Author,Title,Edition} must保留密钥(唯一)以便prevent像这样的东西:

BookID  Author      Title           Edition
-----------------------------------------------
  1      C.J.Date  Database Design     1
  2      C.J.Date  Database Design     1

总结一下,添加BookID——并选择它作为主要的——并没有停止{Author, Title, Edition}是(候选)键。它仍然必须有自己的唯一约束,通常还有匹配索引。

另请注意,从设计角度来看,这个决定是在“物理层面”完成的。一般来说,在设计的逻辑层面上,ID不存在——它是在考虑列大小和索引时引入的。因此,物理模式是从逻辑模式派生出来的。根据数据库大小、RDBMS 和使用的硬件,这些大小推理都可能不会产生可测量的效果——因此使用{Author, Title, Edition}作为 PK 可能是完美的设计——除非得到不同的证明。

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

复合主键与附加“ID”列? 的相关文章

  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • 如何跟踪用户在 X 天内每天访问该网站?

    Stack Overflow 上有一个新徽章 这 woot https stackoverflow com badges 71 woot enthusiast 徽章将授予连续 30 天内每天访问该网站的用户 如何实现这样的功能 如何以最简单
  • 如何使用 DateTime 执行 SQL NOT NULL?

    一个人如何处理DateTime with a NOT NULL 我想做这样的事情 SELECT FROM someTable WHERE thisDateTime IS NOT NULL But how 嗯 它有效吗 我刚刚测试过 Obje
  • 根据表sql中的行替换字符串中的字符

    我需要用一些映射的字符替换字符串中的字符列表 我有一个表 dbo CharacterMappings 有 2 列 CharacterToFilter 和 ReplacementCharacter 假设这个表中有3条记录 Filter Rep
  • 连接两个表的查询的 SQL Server“FOR XML”输出

    我是 SQL Server 中 FOR XML 功能的新手 我正在使用 SQL Server 2012 我有两个表 Word 和 Word Expansion 样本数据 表 字 WordOID Word 1 PIPE 2 WIRE 表 Wo
  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA
  • SQLite HAVING 比较错误

    我有一个测试 SQLite 表 用于存储带有值的报告数据 CREATE TABLE IF NOT EXISTS test fact daily revenue date TEXT revenue NUMERIC product TEXT I
  • 如何在Oracle中使用Timestamp_to_scn和Scn_to_timestamp?

    我的查询结果是这样的 select cast to date a start time mm dd yyyy hh mi ss pm as timestamp date of call ora rowscn from calling tab
  • 如何使用PostGIS将多边形数据转换为线段

    我在 PostgreSQL PostGIS 中有一个多边形数据表 现在我需要将此多边形数据转换为其相应的线段 谁能告诉我如何使用 PostGIS 查询进行转换 提前致谢 一般来说 将多边形转换为线可能并不简单 因为没有一对一的映射 http
  • 为什么这会返回资源 id #2? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • 快速转储 SQL Server 表

    我在 SQL Server 2008 R2 中有一个大表 它包含数十亿行 我需要在我们的应用程序中加载整个数据集 查询全表非常慢 我想使用 bcp 将其转储到文件中并加载它 但问题是字符串列包含各种特殊字符 如 t 0 逗号和 n 我找不到
  • SQL Server,插入 Excel“链接服务器”时出现“无效列名”错误

    我有一个简单的 Excel 电子表格文档 运行 Office 2013 我使用 Microsoft Office 15 0 Access 数据库引擎 OLE DB 提供程序 将其用作数据库 我可以使用 MS SQL Server Manag
  • fetchsize和batchsize对Spark的影响

    我想通过以下方式控制 RDB 的读写速度Spark直接 但标题已经透露的相关参数似乎不起作用 我可以得出这样的结论吗fetchsize and batchsize我的测试方法不起作用 或者它们确实会影响阅读和写作方面 因为测量结果基于规模是
  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • 使用 JSON 参数的 Postgres 批量 INSERT 函数

    这是一个plpgsqlpostgres 的函数9 6 它试图INSERT一行 如果插入没有失败 由于违反键约束 那么它会运行更多命令 CREATE FUNCTION foo int text text RETURNS void AS BEG
  • 避免连接失败时出现空指针

    我有我的域类 带有命名查询 class Atendimento implements Serializable Funcionario funcionario static mapping funcionario column FUNCOD
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 如何从 PostgreSQL 中的时间戳列值提取一天中的时间(或小时)?

    我正在尝试从 PostgreSQL 中的 时间戳 列中提取一天中的时间 这是我的做法 但是 太糟糕了 知道如何做得更好吗 SELECT date part hour date demande text hours date part min
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • 探查器模板可以迁移到较新版本的 SQL Profiler 吗?

    是否可以将 Profiler 模板迁移到较新版本的 SQL Server 就我而言 我想将 SQL 2008 模板带到 2012 年 我尝试过 1 直接文件复制和 2 导出 导入 在这两种情况下 旧模板都会运行 但无法修改 修改后会出现以下

随机推荐

  • 允许同时创建多少个AVPlayer?

    我有一个collectionView和每个cell has an AVPlayer即将播放 所以每个细胞都在同时播放视频 iOS 好像只允许同时播放 16 个视频 例如 请查看下面我的示例应用程序 满分 50cells 只有 16 人开始播
  • 从动作脚本库中检测 AIR 与 Flash Player

    我有一个 SWC 其操作方式需要略有不同 具体取决于它是否由 AIR 托管 我在网上看到了两个建议 测试 WindowedApplication 的 Application application 测试 Security sandboxTy
  • Ruby on Rails 中自动递增非主键字段

    在RoR迁移中 如何自动递增非主键字段 我想在数据库定义中而不是在模型中执行此操作 您需要执行一条 SQL 语句 statement ALTER TABLE users CHANGE id id SMALLINT 5 UNSIGNED NO
  • 隐藏解释器导入的模块

    我构建了一个模块 它使用几个不同的模块来完成各种任务 当我在 IPython 中导入模块并列出可用于自动完成的函数时 这些外部模块包含在该列表中 是否有可能以某种方式隐藏它们 在Python中 模块可以定义一个 all 变量 它是某人执行以
  • MVC“添加控制器”是“无法检索元数据...配置系统无法初始化”

    我从头开始创建了一个包含两个项目的新解决方案 一个是 MVC 3 另一个是支持 EF 4 2 项目 整个事情构建成功 我从 MVC 项目中打开 添加控制器 对话框 并让它根据我从支持 EF 项目中选择的上下文和模型生成代码 添加控制器 对话
  • 后台计时器更新 UI?

    我的申请遇到了一点问题 我想每 10 秒更新一次 UI 上的内容 我首先使用了一个DispatcherTimer为此 但它会在短时间内阻止我的 UI 因为更新方法需要从网络加载某些内容 并且此操作需要一些时间 现在我想到了某种后台工作者 然
  • Windows批处理脚本解析CSV文件并输出文本文件

    我在另一个页面上看到了回复 帮助编写批处理脚本来解析 CSV 文件并输出文本文件 出色的代码顺便说一句 ECHO OFF IF 1 GOTO EOF SET filename 1 SET fcount 0 SET linenum 0 FOR
  • 在某个短语之后分割字符串?

    我有一批绳子需要剪掉 它们基本上是一个描述符 后面跟着代码 我只想保留描述符 a descriptor dps 23 fd another 23 fd and another fd and one without a code 上面的代码是
  • 在没有无限摘要的情况下从 Angular 成功调用history.pushState()?

    有办法打电话吗history pushState 没有角度进入无限消化循环 我正在尝试将我的应用程序从后端路由迁移到前端路由 并且所有 stackoverflow 帖子 google 资源似乎都没有答案 这就是我们基于 github 评论在
  • 如何添加 IDesignTimeDbContextFactory 的实现以添加迁移到 .Net core 2.0 应用程序?

    我正在尝试从 NET Core 2 0 MVC 应用程序的包管理器控制台运行 Add Migration InitialCreate 命令 查看所有可能的来源后仍然无法解决问题 错误描述为 PM gt Add Migration Initi
  • 如何在 Neo4j 2.2.0-RC01 上禁用基本身份验证

    目前我使用 Neo4j 2 2 0 RC01 它默认启用基本身份验证 如何禁用 Neo4j 2 2 0 RC01 上的默认基本身份验证 In file conf neo4j server properties 将 dbms security
  • 为什么在 C++ 中使用 try 和 catch()?

    我明白那个try and catch 用于异常处理 以防在某些情况下程序发生错误或崩溃 我也了解它们是如何工作的 但为什么要使用try and catch 为什么不直接使用if 查找特定案例的语句 如果该案例为真 则确实如此cout lt
  • 如何在Java中用空字符串替换'

    如何在 Java 中将单引号 替换为空字符串 我尝试跟随但似乎不起作用 String data Sid s den data replace data replaceAll 提前致谢 非常感谢任何帮助 输出应该是 Sids den 谢谢大家
  • Django filter() 查找类型文档

    我查看了 Django 的文档并用 Google 搜索了该短语的每个变体 但我找不到任何准确描述查找类型行为的文档 app objects filter column lookuptype criteria 我找到了有关我的查找类型的文档c
  • 为什么向 Double.MaxValue 添加数字不会使其成为 Double.PositiveInfinity?

    In 双正无穷文档中写道 当运算结果大于 MaxValue 时返回该常量 但是 当我尝试将数字添加到最大值时double 它不会返回infinity 我尝试过运行这个 double maxVal Double MaxValue maxVal
  • Python PDFMIner - PDF 到 CSV

    我希望能够将 PDF 转换为 CSV 文件 并找到了几个有用的脚本 但是作为 Python 新手 我有一个问题 在哪里指定要打印到的 PDF 和 CSV 的文件路径 我正在使用 Python 2 7 11 和 PDFMiner 201403
  • Swift 以编程方式导航到另一个视图控制器/场景

    我正在使用以下代码以编程方式导航到另一个 ViewController 它工作得很好 但它在某种程度上隐藏了navigation bar 我该如何解决 导航栏是通过嵌入ViewController in the navigation con
  • 具有 Tensorflow 后端的 Keras 可以强制随意使用 CPU 或 GPU 吗?

    我安装了 Keras Tensorflow 后端和 CUDA 有时我想按需强制 Keras 使用 CPU 无需在虚拟环境中安装单独的仅 CPU 的 Tensorflow 即可完成此操作吗 如果是这样怎么办 如果后端是 Theano 则可以设
  • Shiny:observeEvent和eventReactive有什么区别?

    我现在读了几次有关反应式编程的闪亮文档 但我无法正确理解两者之间的区别observeEvent and eventReactive 文档说 每当您想要执行操作来响应事件时 请使用observeEvent 请注意 重新计算值 通常不算作执行操
  • 复合主键与附加“ID”列?

    如果我们有一个这样的表 书籍 假装 ISBN 不存在 Author Title Edition 出版年份 Price 有人可能会说 Author Title Edition 可能是候选 主键 是什么决定了候选 主键是否应该是 Author