Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当一个表通过非素数字段引用另一个表时,违反了什么数据库设计原则?_Sql_Relational Database - Fatal编程技术网

Sql 当一个表通过非素数字段引用另一个表时,违反了什么数据库设计原则?

Sql 当一个表通过非素数字段引用另一个表时,违反了什么数据库设计原则?,sql,relational-database,Sql,Relational Database,假设你有两张桌子。其中一个表包含由代理键索引的数千个客户,以及一个客户名称字段(显然是非素数)。另一个跟踪购买的表按客户的姓名而不是相应的代理键引用客户 如果我试图向某人证明为什么这是不好的(显然是这样),是否有一种命名的设计理念被违反了?由于创建了冗余,直观上你会认为这些表没有进行规范化,但由于它涉及两个不同表之间的关系,我个人很难理解规范化是如何应用的。我可能完全偏离了基准,但在这种情况下,规范化和数据库设计理论应该退居传统程序精度的后面。如果您有两个名为“John Smith”的客户,如果

假设你有两张桌子。其中一个表包含由代理键索引的数千个客户,以及一个客户名称字段(显然是非素数)。另一个跟踪购买的表按客户的姓名而不是相应的代理键引用客户


如果我试图向某人证明为什么这是不好的(显然是这样),是否有一种命名的设计理念被违反了?由于创建了冗余,直观上你会认为这些表没有进行规范化,但由于它涉及两个不同表之间的关系,我个人很难理解规范化是如何应用的。

我可能完全偏离了基准,但在这种情况下,规范化和数据库设计理论应该退居传统程序精度的后面。如果您有两个名为“John Smith”的客户,如果采购表键入了“John Smith”(即正确的John Smith)的名称,您如何识别哪些采购属于“John Smith”?如果是这样的话(也就是说,没有白痴的名称篡改策略来识别“正确的”约翰·史密斯),那么命名原则将是“返回正确答案的原则”。-)


如果这个名字被篡改成约翰·史密斯(1)!=约翰·史密斯(2),节约原则适用:在所有其他因素相同的情况下,正确解的总体中最简单的就是最佳解。你选吧。

它不是第三范式的标准化。第三种标准形式要求根据候选密钥(即唯一密钥)进行引用

在您的示例中,您可能有多个同名客户,这意味着:

  • 不能在两个表之间强制1:1关系
  • 除非为name列编制索引,否则这两个表之间的联接将无法很好地执行

  • 如果您正在处理一个大型数据库,这可能会出现问题,因为您最终会得到重复的名称(例如John Smith)。

    当您说规范化应该放在其他事情的后面,然后解释为什么偏离规范化是一个坏主意时,您自相矛盾。因此投了反对票。事实上,我指出要么设计有致命的缺陷(即查询将返回错误的答案),要么任何可能的解决方案使答案正确(即通过某种复杂的消歧策略使非主要客户字段唯一)这将比简单地使用最明显的解决方案——通过主键访问客户表更复杂。没有什么自相矛盾的。好吧,如果人们乐于接受这样一个荒谬的、彻头彻尾的妄想答案,那就随它去吧。但请记录在案:在整个+传统数据库范式(1NF、2NF、3NF、BCNF、4NF、5NF、6NF、ETNF)集合中,没有一个单独的成员表示外键或其或多或少的理论基础,即包含依赖性。