【问题标题】:Should I use my two columns that uniquely identify a record as primary key?我应该使用我的两列唯一标识一条记录作为主键吗?
【发布时间】:2016-05-26 12:13:14
【问题描述】:

我通过遵循一些在线教程开始设计一个跟踪系统事件的数据库,并且一些简单的示例从将自动递增的 ID 分配为主键开始。我查看了我的数据库,我真的不需要 ID。在我的所有列中,时间戳和设备 ID 是共同标识唯一事件的两列。

我的程序现在所做的是从系统日志中提取过去 x 分钟内的一些事件并将这些事件插入数据库。但是,我可能会过多地回顾过去,以至于事件与数据库中已有的内容重叠。正如我之前提到的,时间戳和设备 ID 是唯一标识事件的两个字段。我的问题是,我是否应该使用这两个字段作为我的主键并从现在开始使用“Insert ignore”以避免重复记录?

【问题讨论】:

  • Here 是你如何做到这一点的,我看不出你的复合主键有什么问题。

标签: mysql database


【解决方案1】:

最好不要将您的业务值作为表的主键,而是始终使用合成的,例如自动增量,此值。当业务需求发生变化时,您将在未来让您的生活更轻松:)

我们目前正在努力应对这种情况。有一列将业务价值作为主键 2 年,现在痛苦地引入了自动增量。

【讨论】:

  • 如何解决重复记录问题?对照旧记录(大小 m)检查新记录(大小 n)的运行时间为 O(nm)...
  • @return0 你仍然可以对(设备,时间戳)对有唯一约束
  • ...为了详细说明 Nikem 的评论,MySQL 将唯一约束实现为(B-Tree)索引——就像主键一样——因此在其中的搜索是 O(log m),并且成本因此,检查所有新记录的时间将是 O(n log m)。
【解决方案2】:

您将来可能需要使用来自其他表的外键来链接两个表之间的某些行。使用单列主键更容易。
但是,如果您现在不需要它 - 无需为索引创建专用列。将来可以更改表以添加具有自动增量的列并将主键移动到它。

【讨论】:

  • 很可能有复合外键(事实上,MySQL 可以强制复合外键约束)。
  • @eggyal,是的。我只说外键按一列比多列键更简单。如果它是复合的,您需要使用外键在每个表中复制两个、三个或更多列。这将在表和键缓冲区中占用更多的大小。可以使用特殊的自动递增键列来避免这种情况。
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多