2

我有一个数据库,将哈希值和一些关于哈希的数据存储在一个表中。其中一个字段是“job_id”,它是哈希来自的作业的 ID。

我要解决的问题是,在这种设计中,哈希只能属于一个作业——实际上,哈希可以出现在许多作业中,我想知道每个作业中都会出现哈希。

我正在考虑这样做的方式是创建一个名为“Jobs”的新表,其中包含“job_id”、“job_name”和“hash_value”字段。当一批新数据插入数据库时​​,作业 ID 和名称将在此处创建,每个哈希将与原始哈希表一样进入此处,但在作业表中,它也将针对作业存储.

我不喜欢这样,因为我会跨表复制哈希列。有没有更好的办法?我可以添加到哈希表中,但不能删除任何列,因为闭源软件依赖于它。哈希值是主键。它是 MySQL,数据库存储了数百万条记录。提前致谢!

4

3 回答 3

1

我要解决的问题是,在这种设计中,哈希只能属于一个作业——实际上,哈希可以出现在许多作业中,我想知道每个作业中都会出现哈希。

我正在考虑这样做的方式是创建一个名为“Jobs”的新表,其中包含“job_id”、“job_name”和“hash_value”字段。

只要您可以获得a)正确的外键和b)“job_id”和“hash_value”的级联正确,那应该没问题。

重复数据冗余数据是关系建模中的技术术语。技术术语 意味着它们具有您在字典中不太可能找到的含义。它们并不意味着“相同的值出现在多个表中”。这应该很明显,因为如果您将这些值替换为代理 ID 号,那么这些 ID 号将出现在多个表中。

这些技术术语实际上意味着“具有相同含义的相同值”。(相关:Hugh Darwen关于谓词的定义和使用的文章。)

用 ID 号替换文本可能有很好的实际原因,但没有理论上的理由这样做,规范化当然不需要它。(没有“每一行都有一个 ID 号”范式。)

于 2013-01-08T15:40:40.337 回答
1

添加新job表是要走的路。这是代表一对多关系的规范做法。

避免不必要的重复值是很好的。但是在这种情况下,您并没有真正“复制”该hash_value列。相反,您实际上是在定义与作为主键job的表之间的关系。hash_value

关系是通过给子表增加一列来实现的;该列包含父表中的主键值。通常,我们也会在列上添加 FOREIGN KEY 约束。

于 2013-01-08T15:42:11.737 回答
0

如果我正确阅读了您的问题,那么由于以下两个事实,您的设计存在根本缺陷:

  • 哈希是主键(引自您的问题)
  • 可以从多个不同的输入生成相同的哈希(事实)
  • 你有数百万个哈希(来自问题)

使用数百万行/散列,最终您会遇到散列冲突。

唯一明智的方法是将 job_id 作为主键并在具有非唯一索引的列中散列。给定哈希查找工作将很简单。

于 2013-01-08T15:41:00.510 回答