跟踪没有主键的数据更改

时间:2013-02-10 10:41:39

标签: database database-design primary-key

我正在编写一个使用CC-CEDICT的应用程序,这是一本CC许可的汉英词典。

字典仅作为zipped text file (4MB)提供,其条目格式如下:

Traditional Simplified [pin1 yin1] /English equivalent 1/equivalent 2/

这是样本数据:

是 是 [shi4] /is/are/am/yes/to be/
昰 是 [shi4] /variant of 是[shi4]/used in given names/
時 时 [Shi2] /surname Shi/
時 时 [shi2] /o'clock/time/when/hour/season/period/

我故意选择这些线来说明我的问题。数据没有可识别的密钥,通过该密钥可以识别单个单词。

英语定义可以改变,并且随着字典不断更新而做,但是在一次更新中假设时间改变的两个定义,所以下一个下载包含行:

時 时 [Shi2] /last name Shi/
時 时 [shi2] /o'clock/time period/when/hour/season/

我如何判断哪些记录已更新?当翻译是一个完全改变的单个词时,这一点非常明显。

我正在制定一个关于如何键入这本词典的策略。到目前为止,我最好的想法是将(简体,繁体)作为关键,并将重复项视为特殊情况 - 在他们自己的表中也许??

2 个答案:

答案 0 :(得分:1)

问题是透视问题。

您说您的记录没有密钥,但实际上 整个记录是密钥 - 假设您没有相同的重复记录。

因此没有更新 插入删除

您可以跟踪哪些记录已删除以及哪些记录已插入,以突出显示字典中的更改。


如果您确实想要将定义替换视为更新,那么您将不得不想出一个方案(a)为记录创建唯一键并且(b)允许您识别何时应将新定义列表视为对现有定义列表的修改。

部分(a)很简单,添加自己的代理键。这可能在所有定义中都是唯一的,或者只是跨越(简体,繁体)的组合。

(b)部分更难。在什么时候你说“姓氏”与“姓氏史”有关?我建议提出某种文本比较功能,产生一个数字分数。选择此分数的阈值,您将其称为更新而不是删除和插入。这将是任意的,但您可能会发现两个人可能不同意什么是更新,什么不是从一个案例到另一个案例。

答案 1 :(得分:0)

这不是解决方案,但可能会为您(或其他人)提供一些想法。

如何将此建模为层次结构,Word->含义 - >翻译。 计算转换的哈希值,将所有转换的哈希值相加并将其存储在相应的“含义”记录中,然后将所有含义的哈希值相加并将其存储在Word记录中。 (是的,这是非规范化的)。

每次都必须重新计算文件中所有记录的所有哈希值。然后,您可以简单地将当前存储的“单词”哈希值与刚刚计算的哈希值进行比较。如果它们不同,就会发生变化。要么有新的含义,要么删除新的翻译或翻译,等等。然后,您可以完全删除该单词(级联)并重新插入新的“子树”。如果你想使事情变得复杂,你也可以进入层次结构并尝试确切地检测到改变了什么。