SQL数据库中的跨表依赖/约束

时间:2017-07-18 18:29:50

标签: sql database constraints database-normalization functional-dependencies

举一个例子,我有一个名为classes的表,其中包含大学课程,还有一个名为students的表格可以容纳学生。一个班级有很多学生,一个学生只能上一节课。 (1对多的关系)。如果我在classes中有一个专栏存储了一个班级的学生总数,那么感觉它应该违反3NF。但是依赖关系是在一个单独的表中。这个依赖叫什么?我们可以说这违反了3NF吗?因为在某种意义上它具有3NF违规的所有问题。我想知道这是否是一个相关案例。

2 个答案:

答案 0 :(得分:2)

<强> TL; DR

  

但依赖是在一个单独的表中。

你的意思是在另一个表上存在依赖(在日常意义上)。我们说这两个表有约束。 (它们相互依赖。)除了FK(外键)约束之外,每个students classes值都是classes class值。

  

这个依赖叫什么?

我们可以合理地将约束分类为&#34; inter-table&#34;。这是classes等于SELECT class, SUM(student) AS total FROM classes LEFT JOIN students USING (class) GROUP BY class

  

我们可以说这违反了3NF吗?

约束并不涉及违反NF。此外,规范化仅适用于单个表及其FD(功能依赖性)。

(一个简单的设计是基础students,基础classes1是原classes而不是totalVIEW classes AS SELECT class, SUM(student) AS total FROM classes1 LEFT JOIN students USING (class) GROUP BY class。)

  

如果我在classes中有一个专栏存储了一个班级的学生总数,那就觉得它应该违反3NF。

表是否在给定的NF(正常形式)中与任何其他表无关。 (我们说数据库在所有表格中都在给定的NF中。)无论你的设计是否不好,都是another matter

由于一个班级只有一个学生总数,total class classes的{​​{1}} FD(功能依赖),即class在功能上确定{ {1}}。

We say that a set of columns functionally determines another set in a table when each subrow for the first always appears with the same subrow for the second.归一化为更高的NFs取代了一个表格,根据它的连接,根据FD和&amp;其中包含的JD(连接依赖项)。 There is redundancy in a database when two tables say the same thing about the business/application situation; but not all redundancy is bad.学习正确的信息建模&amp;数据库设计。

可能会或可能不会违反NF,让您的班级学生在total中列为专栏。什么FD违反NF取决于所有存在的FD和NF。 (如果你在谈论那个特定NF的某个特定部分的特定部分,那么只讨论特定NF中特定FD的特定FD是有意义的。)

(如果DBMS计算/计算/生成的列违反了没有它的NF,那么这不是问题,因为它是由DBMS控制的。你可以想到这个表作为没有列的表的视图。)

  

但依赖是在一个单独的表中。

当一系列数据库状态无法保存每个表列的所有值时,我们说 constraints 保持或数据库约束。 FD(功能依赖性),MVD(多值依赖性),JD(连接依赖性),IND(包含依赖性),EQD(相等依赖性)和其他&#34;依赖性&#34; (在技术上,给定上下文的表达式)每个都与某些约束相关联。 CK(候选键),PK(主键),超级键(SQL classes&amp; PK),FK(外键)(技术上都是列集)&amp; ;其他概念也各自与某些约束相关联。但任意条件可以保持一系列数据库状态。

SQL有一个独特但相关的概念UNIQUE NOT NULL,其特征是名称和表达式/条件(上述意义上的约束),由适当的语法声明。列类型限制了州constraintPKUNIQUE&amp; NOT NULL限制。 CHECK给出状态的任意条件,但大多数DBMS不支持它。 ASSERTION支持一些状态间的表间约束。 SQL CASCADES强制执行任意约束。索引还以DBMS特定的方式强制执行约束。

  

因为在某种意义上它存在3NF违规的所有问题。

您的修改改进了您的问题。使用错误的单词或以错误的方式使用单词最好说明不是我们的意思。但是,当我们写的东西没有意义时,它表明我们的问题,无论它涉及什么,都涉及不知道这些词的意思。强迫自己正确使用单词让其他人知道我们真正的意思。例如,这里可能&#34; ...在表的连接中......会有一个违反3NF的FD ...&#34;。即使明确地说我们不确定我们可以传达一些模糊的摸索而不说一些我们并不意味着的东西。例如,你的感觉就像...&#34;。但它也引导我们清楚地组织我们面临的问题。这不仅有助于我们正在解决的问题,还可以帮助我们解决问题。

答案 1 :(得分:0)

它不违反规范化,但维护而不是在查询中进行计数会很痛苦。

注意:连接表用于多对多。