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

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

我正在寻找围绕整个 schema.org 构建应用程序的最佳方式。 Schema.org 层次结构现在包含大约 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 对那些数不胜数的属性进行建模
  • 多重继承或类似的东西(混合)
  • 记录之间的有用链接(例如 JobPosting 指向组织及其所属地点)
  • 简单查询(例如,获取给定组织的所有 JobPosting)

请告诉我什么样的信息有助于找到更好的答案。

最佳答案

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

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

Note Sometimes, embedding might be more appropriate, but that depends heavily on the way your documents are updated. In particular, many objects might refer to the same address, so a change in address should be reflected everywhere. Sometimes, the opposite is true. This is a key question that can be answered only by you. It depends on how the system is used.

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

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

另一方面,如果您想就地显示所有内容,则必须执行更多查询并在代码中构建域模型对象。这没什么大不了的,但在循环引用等情况下需要格外小心。

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

唯一剩下的问题是多重继承或混合。我以前没用过ruby,但我猜是mongodb ruby​​驱动支持mixins。

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

关于database-design - 您将如何为通用 Schema.org 存储建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8849181/

相关文章:

php - 使唯一键与 NULL 值一起使用?

node.js - nodejs和mongoskin,保存所有项目后的回调

cassandra - Spark 中工作如何分配

algorithm - 解释 Merkle 树用于最终一致性

database-design - 数据库表中包含版本号的列的名称

database-design - 多个 FK 列都指向同一个父表 - 一个好主意?

MongoDb如何按月和年聚合

node.js - Nodejs无法连接到云shell上的mongodb

java - 如何使用 Spring Data Cassandra 将域对象映射到 CQL 表?

mysql - 2个不同实体的评论系统