【问题标题】:Choice of primary key for mysql database for fast updatesmysql数据库主键选择,快速更新
【发布时间】:2013-12-23 07:45:44
【问题描述】:

我需要创建一个表来存储来自不同客户端的“events”,每个事件都有一个event_id。 event_id 对于特定客户端是唯一的,这意味着 event_id(integer) 和 client(varchar) 的组合可以作为主键。我打算将此表用作我使用休眠的 Java 应用程序的数据提供程序。用例将是添加事件、更新事件和处理事件以生成报告。

我想确保快速准确的更新,这需要获取准确的行并在休眠状态下更新它。

请告知主键应该是什么:

  1. 使用 event_id 和客户端列创建主键
  2. 使用 auto_increment 创建额外的 id 列,并使用 event_id 和 client 创建唯一索引

我很困惑是否要创建一个带有 auto_increment 列的 id

【问题讨论】:

  • 首选非功能性、单列、纯技术、自动生成的主键。
  • @JB Nizet:在这种情况下,我需要使用逻辑来确定数据库中是否存在一行。这不会减慢保存/更新过程吗?假设我每分钟收到 1 个事件,这意味着我每天从单个客户端收到 1440 个事件,如果我有 3 个客户端,行数将为 1440*3,行数将在几天/几个月内快速增长。一旦我收到一个事件,我需要确定是否需要更新或保存我想决定一个表结构,这使得这个插入/更新逻辑更简单和快速?虽然我不确定制作组合键是否会带来良好的性能?
  • event_id + 客户端是否是主键不会改变任何东西:您必须检查该行是否存在。性能将取决于是否为 event_id + 客户端定义了索引。不管是不是PK。
  • @JB Nizet:好的,那么建议使用非功能性、单列、自动生成的键的原因是什么。应用程序将以何种方式从中受益?一个额外的列只会意味着更多的空间。由于我将无法使用此列来获取确切的行,它有什么用处?另一方面,如果我从 client+event_id 创建一个键,我可以立即检查该行是否存在?
  • 因为您的应用程序的其余部分将能够通过单个数字 ID 引用客户端事件,而不是通过两个信息的组合,其中一个是文本信息。因为如果您稍后将第三个信息添加到事件的功能键,或者更改文本客户端 ID 的值,您将不必更改所有具有客户端事件表外键的表。因为通过单列访问事件,数字 PK 比通过复合文本访问事件更快。因为 Hibernate 映射和使用它的代码会更容易编写,等等。

标签: mysql hibernate


【解决方案1】:

基于 JB Nizet 的 cmets

更喜欢非功能性、单列、纯技术、自动生成的主键。 因为您的应用程序的其余部分将能够通过单个数字 ID 引用客户端事件,而不是通过两个信息的组合,其中一个是文本信息。因为如果您稍后将第三个信息添加到事件的功能键,或者更改文本客户端 ID 的值,您将不必更改所有具有客户端事件表外键的表。因为通过单列访问事件,数字 PK 比通过复合文本访问事件更快。因为 Hibernate 映射和使用它的代码会更容易编写等等。

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2015-05-21
    相关资源
    最近更新 更多