外键困境

Foreign key dilemma

大家好,我遇到了外键难题。假设我们有 Table A 和 Table B 和 Table C.

Table A 是 super table B 的 child,记录通过外键从 A 连接到 B(一种方式)。现在 table C 包含可应用于 A 和 B 的信息。我知道在 table B 上获得此信息会派上用场,但我不确定 table A,从技术上讲信息也可能属于 table A.

现在我的问题是,让 table A 通过 table B 中的 parent 行访问 table C 中的信息会更好吗? "shortcut" 从 table A 到 table C 并直接引用 table C?

为了简化这两个选项:

选项 1:table A 引用 table B + table B 引用 table C

选项 2:table A 引用 table B + table B 引用 table C + table A 引用 table C

选项 2 是否有任何好处,因为相同的信息与选项 1 相差 table?

一个FOREIGN KEY

  • 一个隐式生成的索引(为了性能)和
  • 约束(用于数据完整性);

FK 只是间接的"how you reference another table"。所以,我更希望你简单地谈谈专栏。 (任何列 都可以 用于 'reference' 任何其他 table。)

许多教科书原则之一是 DRY -- 不要重复自己。这是一个明智的原则,因为最终会出问题,重复的数据会变得不一致。从 A 到 C 的额外 link 是多余的。

另一方面,在庞大的数据集中,各种教科书原则都被违反以提供所需的性能。 ("huge",我的意思是数十亿行,也许数百万,但不是数千。)

由于您似乎刚刚起步,我建议您在遇到问题时不要走捷径和担心性能。是的,需要额外 JOIN.

对于新手来说,性能问题通常很快就会出现,但并不是因为没有捷径;还有许多其他课程需要先学习。提示:了解 "composite indexes";我认为这是初学者无法学习的第一演奏技巧。 (并且专注于 FK 会分散对 INDEXes 的注意力。)