【问题标题】:Is it a bad idea to make a count the primary key?将计数作为主键是一个坏主意吗?
【发布时间】:2014-04-26 16:25:16
【问题描述】:

只是考虑数据库设计问题。假设我有一张这样的表:

CREATE TABLE LEGACYD.CV_PLSQL_COUNT 
(
    RUN_DTTM  DATE NOT NULL,
    TABLE_NAME VARCHAR (80) NOT NULL,
    COUNT Number(50) PRIMARY KEY
);

这是一个坏主意 - 将 COUNT 设为 PRIMARY KEY 吗?一般来说,我应该如何决定什么是主键?

【问题讨论】:

  • 你的目的是什么?为什么不使用序列?
  • @Mihai - 嗯,为什么序列更好?
  • 这个定义在您的数据库中是否合法? COUNT 是保留关键字。
  • 我用的是Oracle让我看看
  • 从根本上说,您必须知道要在数据库中执行哪些业务规则(特别是有关唯一性的规则)。除此之外,选择键的一些明智标准是:简单性、熟悉性和稳定性。我们无法为您选择,因为我们不知道您正在建模的业务领域,也不知道您的“计数”是否是一个简单、熟悉且稳定的标识符。

标签: sql database-design primary-key


【解决方案1】:

这是一个坏主意 - 将 COUNT 设为 PRIMARY KEY 吗?一般来说,我应该如何决定什么是主键?

候选键基于功能依赖关系。主键是候选键之一。没有正式的方法可以查看一组候选键并说“这个必须是主键。”该决定基于实际问题,而不是形式逻辑。

你的表结构告诉我们这些事情。

  • COUNT 是唯一的。无论此表有多少行,您永远不会找到具有相同 COUNT 值的两行。
  • COUNT 确定 TABLE_NAME。也就是说,给定一个 COUNT 值,我们将永远为 TABLE_NAME 找到一个且只有一个值。
  • TABLE_NAME 不是唯一的。我们希望找到几行具有相同 TABLE_NAME 值的行。
  • COUNT 确定 RUN_DTTM。也就是说,给定一个 COUNT 值,我们将永远只找到一个 RUN_DTTM 值。
  • RUN_DTTM 不是唯一的。我们希望找到几行具有相同 RUN_DTTM 值的行。
  • TABLE_NAME 和 RUN_DTTM 的组合不是唯一的。我们希望在一行中找到 TABLE_NAME 和 RUN_DTTM 具有相同值的多行。
  • 没有其他决定因素。这意味着给定 TABLE_NAME 的值,我们将找到 COUNT 和 RUN_DTTM 的多个不相关的值。同样,如果我们得到 RUN_DTTM 的值,或 {TABLE_NAME, RUN_DTTM} 列对的值。

如果所有这些都是真的,那么 COUNT 可能是一个很好的主键。但我怀疑所有这些事情都是真的。

仅基于列名——一种冒险的方式——我认为唯一的候选键更有可能是 {TABLE_NAME, RUN_DTTM}。我认为也可能是 RUN_DTTM 名称错误,或者 RUN_DTTM 的数据类型错误。如果是日期,您可能打算将其命名为 RUN_DT;如果是时间戳,则数据类型应为 TIMESTAMP。

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 2015-05-12
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多