您将如何为通用Schema.org存储建模

时间:2012-01-13 10:36:26

标签: database-design mongodb cassandra multiple-inheritance schema.org

我正在寻找围绕整个schema.org内容建模应用程序的最佳方法。 Schema.org Hierarchie现在包含大约500种不同的类型,可用于在网站上标记微数据:http://schema.org/docs/full.html

目标是围绕所有这些事物构建一个通用系统,而无需使用默认SQL数据库对500多个不同的表进行建模。

作为一个起始示例,JobPosting似乎很容易建模,因为它只有一些字段,只有两个指向组织和放置对象的链接:请参阅http://schema.org/JobPosting

您建议使用哪种数据库系统(SQL,MongoDB,Cassandra,neo4J,Sesame,...)来建模这类数据?甚至还有一些特殊的Graph或RDF数据库可能是另一种选择。

奖金问题: 目前令我震惊的另一个问题是一些对象基于的多重继承,例如: http://schema.org/Dentist是一个LocalBusiness组织,但也是一个地方,因此它有来自几个不同父母的字段。

所以我正在寻找一个系统:

  • 变量列,因为我不想使用SQL-DDL
  • 为这些大量的属性建模
  • 多重继承或类似的东西(Mixins)
  • 记录之间的有用链接(如JobPosting指向组织及其所属的地方)
  • 简单查询(例如,获取给定组织的所有JobPosting)

请告诉我哪些信息有助于找到更好的答案。

1 个答案:

答案 0 :(得分:6)

我认为MongoDB非常适合,因为它的文档可以更容易地表示各个模式。 (解决了变量列问题)。

要解决链接问题,仅存储引用是有意义的。例如,在JobPosting中,您可能希望存储OrganizationIdPlaceId,因为这些文档相当复杂。这也使查询某个组织的JobPostings变得微不足道。

  

注意有时,嵌入可能更合适,但这在很大程度上取决于文档的更新方式。特别是,许多对象可能引用相同的地址,因此地址的变化应该反映在任何地方。有时候,事实恰恰相反。这是一个只有你自己才能回答的关键问题。这取决于系统的使用方式。

在任何情况下,链接意味着单个查找可能必须遍历引用树。同样,这在很大程度上取决于用例:

假设您要显示JobPosting。现在您可以显示属性列表,对于“组织”,您打印的所有内容都是“ACME,Inc。”有一个链接。该链接将发送到“ACME,Inc。”的详细信息页面在这种情况下,您的查询非常简单。您唯一需要做的就是将组织名称复制到JobPosting(去规范化),这样就更容易显示。

另一方面,如果要在原地显示所有内容,则必须执行更多查询并在代码中构建域模型对象。这不是什么大问题,但在循环引用等情况下需要额外的注意。

我想最好的方法是使用相应的最具体的类型作为集合名称(因此ContactPoint最终在ContactPoint集合中,PostalAddress集合中的PostalAddress等)。

唯一剩下的问题是多重继承或mixins。我之前没有使用过ruby,但我猜mongodb ruby​​驱动程序支持mixins。

您仍然需要处理索引等问题,但同样,这在很大程度上取决于用例。您可能希望索引大多数外键,但其他索引需要手动操作。