多列上的MySQL主键

时间:2012-10-20 23:15:09

标签: mysql

我正在以exel格式提供给我的数据创建一个非常简单的数据库表,我将使用4列:

日期/时间 IP地址 主机名 确定了漏洞

我通常每天会获得一张exel表格,其中包含1000到3000行之间的任何内容。日期/时间字段由YYYYMMDDHHMM组成,可以多次复制,但对于每个相同的日期/时间列应具有唯一的IP地址,例如, 2012-08-26:16:01,80.3.3.255,2012-08-26:16:01,192.168.0.1。审查了一些类似的问题后,为每条记录生成一个唯一的主键,或者加入日期/时间和IP列来创建主键会更有效吗?

3 个答案:

答案 0 :(得分:1)

这取决于至少两个角度:

  • 关于稍后用于选择的WHERE条件:如果您打算单独选择时间戳和IP,我建议您为这些和一个简单的(可能是AUTO_INCREMENT)主要密钥创建非唯一密钥每一行。
  • 如果出现重复的时间戳/ IP,您希望如何处理它:唯一或主键会排除这种情况,而单独的键可以很好地共存。这取决于您的应用程序要求,您更喜欢哪一个。

答案 1 :(得分:0)

我喜欢为大多数/所有表都有一个ID列,所以我会这样做。想象一下,用“笔记”之类的东西扩展你的应用程序 - 如何在没有ID的情况下将它们加入到这个表中?

此外,我遇到过一些自动加载器发疯的情况,ID是识别坏行的有用方法。

正如@Eugen指出的那样,只需在timestamp / IP上创建一个复合唯一索引。

答案 2 :(得分:0)

根据我使用数据库的经验,日期会为主键创建极差的字段。每当我遇到它们时,无论应用程序如何被编程,总会有一些东西让你有点日期。大多数情况下,它是“我错误输入了一个日期,现在我想改变它,但我不能不更新十几个子表”或“数据库只是重复我的数据,因为我更正了日期,软件重新提交了我的报告,它没有办法告诉它是重复的。“

此外,您必须记住日期实际上并不保证是唯一的。作为一个简单的例子,当将时钟转换回夏令时时会发生什么?突然间你有一个日期,凌晨1点发生两次,这意味着你已经有一个合法的情况,其中日期可能会碰撞两个实例。根据您的解决方案,您可能需要确保使用时区或指定UTC。您可以使用UNIX时间戳来帮助解决此问题,但即便如此,您仍然依赖于两个不同的,不相关的计算机系统来正确跟踪时间并就现实达成一致。

同样,IP地址不一定是全球唯一的。专用IP寻址和NAT可以轻松构建两个系统具有相同IP地址的场景。实际上,除非您是所涉及的所有系统的系统管理员,否则您不能可靠地使用主机名,IP地址,MAC地址甚至BIOS序列号并期望保证唯一值。这就是为什么系统BIOS通常具有系统的GUID的原因(尽管我已经看到翻新系统板将具有全零GUID的情况,所以即使这也不确定)。

如果您选择使用这两个字段的复合键,那么我怀疑您将拥有两个世界中最差的。

我知道你正在开发一个非常小的系统并且不太可能出现这些问题,但作为一个系统分析师,我立即怀疑一个程序的持久性,它实际上要求日期和IP地址是唯一的,特别是如果数据来自多个独立来源。