AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-256041

Stonecraft's questions

Martin Hope
Stonecraft
Asked: 2022-07-25 10:43:14 +0800 CST

如何使用自然键和代理键获得“两全其美”?DBMS 会更好吗?

  • 2

我正在设计我的第一个数据库,我发现自己对在为分类变量的每个实例存储整数或字符串之间进行选择感到沮丧。

我的理解是,如果我有一个包含城市的表,我想将其作为国家表的子项,那么最有效的方法是将国家表的 PK 作为城市表中的 FK。但是,为了便于使用和调试,最好始终将字符串名称与国家/地区 PK 相关联。我考虑过的每个解决方案要么不被推荐,要么看起来过于复杂。

我想就这些方法的优点发表意见(或了解新方法),并了解是否必须采用这种方式,或者数据库是否只是因为传统而采用这种方式。

可能的方法:

  1. 使用字符串作为国家/地区的 PK。然后我将在任何子表中为它提供一个人类可读的 FK。显然性能不如使用整数,但我怀疑这可能是获得我想要的便利的最不坏的方式。

  2. 使用将每个国家/地区的字符串名称连接到 states 表的应用程序逻辑创建一个视图。

  • 我不喜欢这个,因为如果应用程序逻辑中断,表格的可读性就会降低。此外,我希望大型连接操作比字符串 PK/FK 的性能损失更严重。
  1. 创建一个单独的表以将数字 ID 与适当的字符串 ID 连接起来。我不确定是否最好有一个表来编码每种类型的关系,或者一个大表有一个大的 ID 池,涵盖所有整数键-字符串值关系。然后,我可以使用应用程序逻辑来查找适当的字符串,并在用户给出字符串名称时将适当的 PK 填充到子表中。
  • 我觉得这也可能非常耗费资源,因为每次向子项添加新行时都必须进行查找。这也意味着我仍然必须创建我想要的视图。
  1. 使用enum数据类型。本能地,这将是我的首选方法,因为它似乎是自然键和合成键之间的理想平衡:使用整数 ID 并给 ID 一个字符串标签,这样字符串本身就不需要重复。
  • 不幸的是,我的研究发现不建议这样做。原因之一是类别不能轻易删除。我不确定这对我来说是否会破坏交易,但我也想知道为什么 DBMS 是这样设计的。分类变量是否常用到足以为它们添加便利功能?
foreign-key primary-key
  • 1 个回答
  • 506 Views
Martin Hope
Stonecraft
Asked: 2022-07-23 08:34:12 +0800 CST

如何在填充子表之前自动在父表中创建条目?数据库术语中叫什么?

  • 0

我想要的是在子表中插入出版物的字符串名称以与出版物表中的出版物的 PK 相关联。例如,假设我有一个县表和一个国家内的州表。states 表将有一个国家列,在国家表中有一个外键。

期望的结果是我有一个“国家”表的“国家”表,其中:

  1. 可以在不首先明确添加其父国家/地区的情况下添加州。
  2. 为了便于使用,字符串名称在所有表中都可见
  3. 我不会为每个表中的每个条目存储字符串的实际副本。

因此,假设我想在一个没有条目的国家/地区添加一个州。我想拥有它,这样当我添加一个包含“Ruritania City”行的数据的对象时,“国家”的值为“Ruritania”,将发生以下情况:

  1. 检查“国家”表中的“Ruritania”条目。
  2. 如果“国家”的“国家名称”列中不存在“Ruritania”,则创建它。
  3. “国家”中新的鲁里塔尼亚条目的新 PK 放在“州”表中新的“鲁里塔尼亚城市”条目的外键列中。PK 用于将国家字符串名称列连接到“州”中具有 Ruritania FK 的所有行。

我确信所有这些都是非常标准的数据库内容,但我无法在文档中找到它。大多数数据库文档都是用数据库术语编写的,我很难知道何时找到了我正在寻找的术语。

我的问题是:

  1. 我所描述的是否可行且合理?
  2. 我将如何用数据库术语提出我的问题,以便我能找到答案?
  3. 如果您有有效实现此目标的具体想法,欢迎提出建议。我正在通过 SQLAlchemy 使用 Postgres,但是任何平台的答案都应该可以帮助我找到我正在寻找的东西。

编辑回应@mustaccio:

我认为不断被术语所抛弃。当我读到“回填”之类的选项时,我将其解释为父表将填充从子表链接的数据。我不希望它开箱即用地工作,但如果不是这样,回填意味着什么?

即使 DBMS 没有实现我描述为一个功能的所有功能,我预计这将是一种足够普遍的需求,以至于会有一种标准的方法来实现它,或者至少是该任务的名称。

关键是我不希望用户在为 Ruritania City 创建条目之前必须考虑是否存在 Ruritania 国家条目。如果用户说 Ruritania City 位于 Ruritania 的国家,则 Ruritania in countries 的条目将在“国家”中创建,如果它不存在。

我并不特别关心这个逻辑是在哪里实现的,只要最终结果是一个人类可以自己理解的表,即使数据库被导出到某个地方并与控制条目创建的逻辑分开。

database-design foreign-key
  • 1 个回答
  • 26 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve