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

时间:2014-02-06 02:17:54

标签: sql relational-database

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

如果我试图向某人证明为什么这很糟糕(显然是这样),那么是否存在被侵犯的名声设计理念?由于正在创建冗余,直觉上您认为表格在某种程度上没有标准化,但由于它涉及两个不同表格之间的关系,因此我个人很难看到规范化是如何应用的。

2 个答案:

答案 0 :(得分:2)

未按第3范式标准化。第3范式要求引用是基于候选键(即唯一键)完成的。

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

  1. 您不能强制执行2个表之间的1:1关系
  2. 除非您为名称列编制索引,否则两个表之间的连接将无法正常运行。
  3. 如果您正在处理大型数据库,则可能会出现问题,因为最终会出现重复的名称(例如John Smith)。

答案 1 :(得分:0)

我可能完全偏离基础,但在这种情况下,规范化和数据库设计理论应该退居二手的老式程序准确性。如果您有两个名为“John Smith”的客户,如果购买表的名称是关键的,您如何才能确定哪些购买属于“John Smith”(正确的John Smith)?如果是这种情况(即没有用于识别“正确”约翰史密斯的愚蠢名称修改策略),那么命名原则将是“返回正确答案的原则”。 : - )

如果名称被修改为John Smith(1)!= John Smith(2),则简约原则适用:所有其他因素相同,最简单的正确解决方案是最佳解决方案。随便挑选。