Sql 实现三重存储原子

Sql 实现三重存储原子,sql,database-design,triplestore,Sql,Database Design,Triplestore,我正试图在一个SQL数据库上实现我自己的triplestore(是的,我知道有一些已完成的项目),并且我正试图决定实现符号“atom”的最佳方式 在一个简单的设计中,我们可以通过创建一个包含三个varchar列的“triplestore”表来实现SQL中的triplestore,三个varchar列分别称为subject、predicate和object。为了节省空间,我打算创建一个“atom”表,它将存储任何主语/谓语/宾语字段中使用的唯一文本,并将这些字段更改为外键,链接回包含其文本的原子

我正试图在一个SQL数据库上实现我自己的triplestore(是的,我知道有一些已完成的项目),并且我正试图决定实现符号“atom”的最佳方式

在一个简单的设计中,我们可以通过创建一个包含三个varchar列的“triplestore”表来实现SQL中的triplestore,三个varchar列分别称为subject、predicate和object。为了节省空间,我打算创建一个“atom”表,它将存储任何主语/谓语/宾语字段中使用的唯一文本,并将这些字段更改为外键,链接回包含其文本的原子

然而,我看到了实现Atom表的几种方法

  • 将文本存储为varchar

    • 优点:索引和强制文本唯一性很简单
    • 缺点:它不能存储任意大的文本
  • 将文本存储为文本blob,以及查询和强制唯一性时要使用的文本哈希

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

  • 在性能、长期可靠性和存储任何类型数据的能力方面,哪种方法更好?如果我使用散列,是否存在对冲突的有效关注?即使很少发生碰撞,也只需发生一次即可损坏triplestore。

    不要浪费任何时间尝试优化此操作,直到您能够证明这是一个瓶颈,并且是最重要的修复事项

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

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

    “任意大的文本”是一个奇怪的要求。为什么要麻烦


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

    空间不是唯一的问题。我在网上读到的大多数文章都认为,通过整数连接和匹配记录总是比通过字符串快得多。你的想法?我已经编写了一个非常基本的SparQL引擎,即使对于基本查询,它也会生成许多SQL连接。在重构模型、测量模型并与旧版本进行比较之前,我如何确定这是否是一个瓶颈?@Cerin:“通过整数连接和匹配记录总是比通过字符串快得多”。对的每个人都这么说。“我如何确定这是否是一个瓶颈”?当您的应用程序太慢并且您已经对其进行了分析以确定SQL是问题所在时。评测是如何衡量性能的。不重构和重新实现。@Cerin:“空间不是唯一的问题”。然而你的问题从“节省空间…”开始,包括许多关于“任意大文本”的观点。如果空间不是唯一的问题,请修正您的问题以确定您的所有问题。