Guru Hints

### 外键以及它的索引

外 键 被 用 来 使 用 逻 辑 方 式 关 联 两 个 数 据 表， 施 加 给 它 们 限 制 数 据 变 化。

这 一 切 开 始 于 主 数 据 表， 它 作 为 被 参 考 表， 需 要 有 一 个 主 键 （当 然， 实 际 上 被 参 考 列 只 要 非 空 并 且 有 唯 一 索 引 也 是 可 以 的， 但 是 使 用 主 键 仍 然 是 较 好 的 方 式）。 从 表 依 赖 于 主 表， 更 新 和 插 入 时 拥 有 外 键 的 字 段 数 据 必 须 符 合 主 表 的 数 据， 从 表 是 外 键 的 参 考 表。

外 键 不 仅 限 制 参 考 表， 也 限 制 被 参 考 表， 限 制 方 式 可 以 是 RESTRICT、 CASCADE 或 SET NULL。 这 意 味 着， 当 被 参 考 表 数 据 发 生 变 化 （更 新 或 删 除） 时， 所 有 的 参 考 表 都 会 检 查 数 据 是 否 合 理， 以 及 是 否 需 要 其 他 附 加 操 作。 查 阅 PostgreSQL 关 于 外 键 的 文 档 可 以 找 到 更 多 细 节。

被 参 考 表 的 特 定 行 数 据 发 生 变 化 时， 所 有 相 关 的 参 考 表 都 会 使 用 外 键 字 段 作 为 条 件 执 行 相 应 的 读 操 作。 因 此， 所有 提 高 读 取 效 率 的 设 计 原 则 也 适 用 于 参 考 表 字 段。 为 了 有 良 好 的 执 行 效 率， 大 多 数 情 况 下 建 立 索 引 是 明 智 的 选 择。 PostgreSQL 并 没 有 强 迫 这 样 做， 需 要 数 据 库 设 计 人 员 来 提 供 合 理 的 索 引。

为 了 方 便， pgAdmin III 在 创 建 外 键 时 提 供 一 个 简 便 的 checkbox， 自 动 检 查 是 否 有 合 理 的 索 引 存 在， 如 果 没 有 则 建 立 一 个。 如 同 所 有 其 它 索 引 一 样， 有 极 少 数 的 情 况 反 而 降 低 总 体 执 行 效 率， 总 得 来 说， 索 引 太 少 比 索 引 太 多 对 性 能 的 影 响 更 大。