【发布时间】:2013-12-23 07:45:44
【问题描述】:
我需要创建一个表来存储来自不同客户端的“events”,每个事件都有一个event_id。 event_id 对于特定客户端是唯一的,这意味着 event_id(integer) 和 client(varchar) 的组合可以作为主键。我打算将此表用作我使用休眠的 Java 应用程序的数据提供程序。用例将是添加事件、更新事件和处理事件以生成报告。
我想确保快速准确的更新,这需要获取准确的行并在休眠状态下更新它。
请告知主键应该是什么:
- 使用 event_id 和客户端列创建主键
- 使用 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 映射和使用它的代码会更容易编写,等等。