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
    • 最新
    • 标签
主页 / dba / 问题 / 2342
Accepted
Siddiqui
Siddiqui
Asked: 2011-04-24 20:31:19 +0800 CST2011-04-24 20:31:19 +0800 CST 2011-04-24 20:31:19 +0800 CST

什么是第一范式中的原子关系

  • 772

我已经阅读了 1NF 的定义,即“如果关系的每个属性都是原子的”。请告诉我什么是原子。

normalization interview-question
  • 8 8 个回答
  • 39072 Views

8 个回答

  • Voted
  1. Best Answer
    Mike Sherrill 'Cat Recall'
    2011-04-26T04:02:41+08:002011-04-26T04:02:41+08:00

    1NF 要求每个关系中每个元组中的每个属性位置都包含适当类型的单个值。类型可以任意复杂。事实上,类型可以是关系。(CJ Date 的书《深入研究数据库:从业者的关系理论》以一种非常容易理解的方式处理了这个问题。)

    “原子”从来没有真正意味着“不可分割”,这就是为什么这个词最终失宠的原因。粗略地说,“原子”意味着如果一个值具有组成部分,则 dbms 要么忽略这些部分的存在,要么提供操作它们的函数。例如,时间戳值具有这些部分。

    • 年
    • 月
    • 天
    • 小时
    • 分钟
    • 秒
    • 毫秒

    这种价值显然是可分割的,所有的数据库管理系统都提供了操作这些部分的功能。它们还提供了一种选择时间戳作为单个值的方法。(当然,确实如此。)

    • 15
  2. nvogel
    2011-04-27T01:28:26+08:002011-04-27T01:28:26+08:00

    “原子”指的是 Codd 从 1969 年开始的原始概念,即关系中每个元组中的每个属性都应该由单个值组成,并且不允许像 CODASYL 模型这样的数据库支持的那种多值结构。

    在现代 SQL DBMS 中,原子性并不是真正的问题。SQL 表不允许多值列,并且值始终是“原子的”。

    • 9
  3. sanjay
    2013-04-16T03:20:32+08:002013-04-16T03:20:32+08:00

    原子意味着无法进一步划分的数据。

    原子性规则:

    • 规则1:具有原子数据的列不能在同一列中有多个相同类型数据的值。
    • rule2:具有原子数据的表不能有多个具有相同数据类型的列。

    像 fullname 列不能说它可以是原子的,因为它可以进一步划分为 lastname,firstname。感兴趣的列也可以进一步划分,因此不能划分的列称为原子列。

    • 2
  4. Chris Travers
    2017-02-02T05:07:31+08:002017-02-02T05:07:31+08:00

    Codd 最初似乎意味着没有值本身就是一个集合。这是一个有用的起点,但“原子”在涉及数据库时没有本体论意义(CJ Date 指出的一点是正确的)。Codd 试图将定义形式化为不能在特殊数据库操作之外进一步分解的东西(即时间戳是原子的,因为提取年份是一个特殊的数据库操作)。换句话说,如果数据库可以分解出子值,那就可以了。但是您不应该有需要应用程序逻辑分解的集合(无序列表)或对象。

    随着时间的推移和在操作环境中与这个问题的斗争,我会提出一个原子性的中间定义,它比 Codd 更严格,并且没有 Date 讨论的兔子洞:

    对于第一范式而言,值是原子的当且仅当:

    1. 该值不是一个集合(是的,我知道 Date 不同意)并且
    2. 没有对该字段的任何子部分的外键引用。

    特别是,一个值的表示不能确定它的原子性。将 IP 地址表示为 "10.0.0.1" vs ARRAY[10,0,0,1] vs 167772161 对于 1NF 分析并不重要,因为这三个都指的是相同的原子值。

    特别是,关于原子性的常见(有时是有用的!)1NF 违规包括:

    1. 将一组标签存储到博客文章或评论中。
    2. 将表存储在表中,其中内部表对其他地方的另一个关系有参照完整性要求。

    这些问题或多或少会产生相同的数据异常。

    • 2
  5. Gaius
    2011-04-25T04:39:50+08:002011-04-25T04:39:50+08:00

    这意味着无法分解密钥。假设您有一个包含三列的表,分别是名字、姓氏和电话号码。您在 (forename, surname) 上声明复合主键。该主键不是原子的,因为它实际上由两列组成。现在假设您将表更改为两列,全名和电话号码,主键为全名。钥匙现在是原子的吗?不,因为在您的应用程序中,您仍然可以在空间上将其拆分为名字和姓氏。现在让我们将表id、full_name 和telephone_number 设为id 上的主键(它是一个整数)。那是原子的,因为整数不能被有意义地分解。

    • 0
  6. Joe Celko
    2014-09-07T15:13:57+08:002014-09-07T15:13:57+08:00

    考虑地球上的一个位置。我可以使用(经度、纬度)对或 HTM(分层三角网格)代码找到它。因为它们都测量相同的数据。这是一个物理事实,我们可以用手机测量;它为您将网格编号转换为 [经度,纬度]),它们在您的模型中必须是原子的或复合的。

    不要将用于测量的比例和用于显示数据的符号与数据的性质混淆。

    • 0
  7. JacquesB
    2021-06-24T23:43:41+08:002021-06-24T23:43:41+08:00

    “原子”只是指任何不是关系的东西。1NF 是关于消除具有作为元素的关系的域。任何不是关系的东西都可以作为值。

    原子值仅就关系代数而言是原子的,例如,您不能以分解关系的方式投影或选择原子值的一部分。

    这并不意味着原子值是严格不可分割的——例如,数据库可能具有选择字符串的子字符串的功能。但这需要特殊功能。您不能仅使用 SELECT 或 WHERE 来分解字符串,就像对表一样。

    • 0
  8. Razaullah
    2017-03-16T17:45:11+08:002017-03-16T17:45:11+08:00

    原子键是一种不能分解的主键。这意味着这个键没有被进一步划分,如学生ID,员工ID。

    • -2

相关问题

  • 多语言词典数据库问题

  • 重复列以加快查询速度?

  • 高级规范化形式是否总是符合低级规范化形式的标准?

  • 标准化练习资源

Sidebar

Stats

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

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +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