【问题标题】:Alternative for composite key复合键的替代方案
【发布时间】:2010-04-26 09:46:29
【问题描述】:

我的数据库结构中所有表都有两列作为主键。

例如,表 Author 有两列,例如 AutherId,它是一个自动递增的数字,而 pc_id 是该 pc 唯一的,它们是复合键 为表。但是当涉及到关系时,我必须为 每一个关系。并且由于我计划使用 Docrtine (PHP ORM) 它有点 像这样使用它有问题。

所以我想知道我是否可以生成一个唯一的 id(也结合 pc_id)并使用它 作为主键。

php 代码类似于 time() 。兰德(1000,9999)。 $pc_id

这样 id 是通过连接时间 + 1000 到 9999 之间的随机数生成的 和 pc_id(pc_id 也是一个从 1 开始的数字)。但这会产生一个需要 bigint 存储的 20 位数字(当 pc_id 为 6 位时)

这个有什么好的选择吗

问候

【问题讨论】:

  • 我不能使用自动生成主键,因为这个数据库将在不同的电脑上运行(不同的 pc_id),然后所有的数据都将被转移到一个公共数据库中,所以如果我只保留自动生成的键作为主键,那么它将被复制

标签: php mysql primary-key composite-key


【解决方案1】:

通常认为让数据库自动生成主键而不是为此使用业务信息是个好主意。

当然,如果您想强制执行唯一性,您仍然可以对您的业务信息进行限制。但是这样可以避免外键等问题。

所以我说,生成一个主键,并获得对您的业务价值的唯一约束

【讨论】:

  • 我不能使用自动生成主键,因为这个数据库将在不同的电脑上运行(不同的 pc_id),然后所有的数据都将被转移到一个公共数据库中,所以如果我只保留自动生成的键作为主键,那么它将被复制。
  • 这听起来很有趣。因此,当您从数据库中检索主键时,您只需连接主键。但是如何使用连接的主键查询数据库呢?
【解决方案2】:

作者表只需要一个主键——AuthorId。为什么会有两个具有相同 id 的作者?如果您有许多电脑与作者的关系,则有一个单独的电脑表,主键为 PcId,字段为 AuthorId。

【讨论】:

    【解决方案3】:

    您可以使用UUID 作为代理键。它在所有服务器中都是全球唯一的。缺点是它是一个 36 字节的字符串,手动传递可能很笨拙。

    如果满足条件,还有uuid_short(),它是 UUID 的 64 位整数表示,但它对如何/何时被视为全局唯一有特定限制,因为它丢弃了字符串 UUID 的一半128 位,因此它可以挤入“bigint unsigned”字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2023-03-03
      • 2015-12-04
      • 2013-08-06
      相关资源
      最近更新 更多