0

我正在尝试在 SQL 数据库上实现我自己的三重存储(是的,我知道那里已经完成了项目),并且我正在尝试确定实现符号“原子”的最佳方式。

在一个简单的设计中,我们可能会在 SQL 中实现一个三元存储,方法是创建一个“三元”表,其中包含三个 varchar 列,分别称为主题、谓词、对象。为了节省空间,我将创建一个“原子”表,它将存储在任何主题/谓词/宾语字段中使用的唯一文本,并将这些字段更改为链接回包含其文本的原子的外键。

但是,我看到了几种实现 Atom 表的方法。

  1. 将文本存储为 varchar。

    • 优点:易于索引和强制文本的唯一性。
    • 缺点:它不能存储任意大的文本。
  2. 将文本存储为文本 blob,以及在查询和强制唯一性时使用的文本哈希。

    • 优点:可以存储任意大的文本。
    • 缺点:稍微复杂一些。根据散列算法(md5、sha 等),可能会发生散列冲突,尽管很少见。

就性能、长期可靠性和存储任何类型数据的能力而言,哪种方法更好?如果我使用哈希,是否有关于冲突的有效担忧?即使冲突很少见,它也只需要发生一次就可以破坏三元存储。

4

1 回答 1

1

不要浪费任何时间尝试优化它,直到你能证明它是一个瓶颈并且是最重要的修复。

“为了节省空间……”不要。空间几乎是免费的。除非您拥有超过 TB 的数据,否则您不必担心太多。您很容易浪费更多的时间来考虑存储,而不是存储的价值。

varchar 解决方案可以正常工作并且可以很好地扩展。“字符串池”或“原子表”的想法实际上是一个很好的想法,因为您将有很多对同一个底层对象的引用。为什么要重复 varchar?为什么不只是重复一个索引号?

“任意大的文本”是一个奇怪的要求。何必?

blob 通常会比较慢。哈希冲突——虽然只是一个理论上的问题——你可以通过两种方式处理。首先,使用超过 32 位的散列。其次,除非您(愚蠢地)未能检查实际的 blob 以查看它们是否实际上相同,否则碰撞不会破坏任何东西。如果您想避免比较整个 blob 以确认没有冲突,请通过不同的算法保留两个哈希值。

于 2011-10-20T19:56:13.183 回答