2

我正在从以 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 列来创建主键会更有效吗?

4

3 回答 3

1

这取决于至少两个角度:

  • 关于WHERE稍后用于选择的标准:如果您计划按时间戳和 IP 独立选择,我建议您为它们创建非唯一键,并AUTO_INCREMENT为每一行创建一个简单的(也许是)主键。
  • 如果确实发生了重复的时间戳/IP,您想如何处理它:唯一或主键将排除这种情况,而单独的键将愉快地共存。这取决于您的应用程序要求,您更喜欢哪一个。
于 2012-10-20T23:22:31.323 回答
0

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

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

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

于 2012-10-21T00:36:45.377 回答
0

根据我使用数据库的经验,日期对于主键来说是非常糟糕的字段。每次我遇到它们时,无论应用程序是如何编程的,总会有一些东西让你用日期来咬你。最常见的情况是“我输入了错误的日期,现在我想更改它,但我不能不更新十几个子表”或“数据库只是复制了我的数据,因为我更正了日期并且软件重新提交了我的报告,它无法告诉它是重复的”。

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

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

如果您选择使用这两个字段的复合键,那么我怀疑您将两全其美。

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

于 2012-10-21T01:08:24.600 回答