我刚学习关系数据库,并被告知他们不允许重复输入。我起初并不相信这一点,因为我编写的SQL查询返回带有重复项的结果。这是系统不存储一个关系中相同的集合吗?我的意思是,如果你有书籍和作者的关系,并且只选择作者,那么如果同一作者写了不同的书籍(例如select author from Books
),那么可能会出现重复。此外,如果您使用加入,那么您可以获得重复的结果,对吗?还有其他场景吗?
基本上当人们说rmdbs没有重复时,他们只是意味着信息的存储方式(在一个表中)对吗?
答案 0 :(得分:8)
关系数据库仅包含关系变量(关系“表”),根据定义,它们始终由唯一元组(“行”)组成。关系数据库管理系统使用基于Codd关系代数的查询语言,同样不能在结果中生成重复,因为关系代数中的每个结果也是一个关系,因此由唯一元组组成。
您的混淆是因为您假设SQL是一种适当的关系语言而SQL DBMS是关系型的。它不是,他们不是。当您开始将SQL与其在关系世界中的近似等价进行比较时,事情变得棘手。您的SQL查询:
SELECT author FROM Books;
可能会返回重复的行,但显然是类似的关系查询:
π author (Books)
不会。关系查询更像是以下SQL:
SELECT DISTINCT author FROM Books;
您必须非常小心SQL,以避免在您不希望或期望它们的地方获得重复项。即使是经验丰富的SQL用户也会遇到问题。
答案 1 :(得分:5)
关系是一组元组。因为它们是集合,所以关系不能包含两次相同的元组。
如果某些内容(例如SQL中的“表”)确实包含“两次相同的元组”,则该内容不是关系,并且该语言不是关系语言。最好的情况是,如果(并且仅当)语言用户对自己施加必要的自律,语言可以以关系方式使用。
简介:关系型DBMS确实不能允许重复,而且典型的SQL引擎不是关系型DBMS,正是出于这个原因(a.o。)
答案 2 :(得分:1)
基本上当人们说rmdbs没有重复时,他们只是意味着 信息的存储方式(在一个表中)对吗?
你基本上是对的。
标准化的一部分是确保不需要存储两次数据,因为这会增加其中一个数据不是最新的风险。这决不与说RDBMS无法存储重复数据相同。它当然可以并且有很多场景甚至被认为是一个可行的解决方案(一个数据仓库)。
完全normalized database (又名无重复数据)与denormalized database (又名完整重复数据)之间的权衡速度是CRUD语句和数据库的大小。
答案 3 :(得分:0)
你可以很好地将重复项放在一个表中,除非有一个特别禁止它的表的约束。
表通常有一个主键,而主键是一个约束,它禁止对作为键的一部分的字段进行重复,这样可以防止表中出现重复的记录。
答案 4 :(得分:-1)
RDBMS可能有重复项,特别是如果它们设置得不好。设置RDBMS需要您了解规范化是什么。如果您有重复项,则表示您的表可能不是第一个规范化表单。第一个标准化表格中表格的定义是消除或消除重复值,因此如果您有重复/重复值,您需要首先通过消除重复值将表格带到第一个标准化表格标准,然后到第2个标准规范化表格,等等。