10

问题域

我正在开发一个相当大的应用程序,它使用分层数据模型。它拍摄图像、提取图像的特征并在这些特征之上创建分析对象。所以基本模型就像Object-(1:N)-Image_features-(1:1)-Image。但是同一组图像可用于创建多个分析对象(具有不同的选项)。

然后一个对象和图像可以有很多其他连接的对象,例如可以使用附加数据细化分析对象,或者可以基于分析对象和其他数据得出复杂的结论(解决方案)。

当前解决方案

这是解决方案的草图。堆栈代表一组对象,箭头代表指针(即图像特征链接到它们的图像,但反之则不然)。某些部分:图像、图像特征、附加数据,可能包含在多个分析对象中(因为用户想对不同的对象集进行分析,组合方式不同)。

当前解决方案简化草图

图像、特征、附加数据和分析对象存储在全局存储(上帝对象)中。解决方案通过组合存储在分析对象中(并依次包含解决方案特征)。

所有实体(图像、图像特征、分析对象、解决方案、附加数据)都是相应类的实例(如 IImage,...)。几乎所有部分都是可选的(即,我们可能想在找到解决方案后丢弃图像)。

当前解决方案的缺点

  1. 当您需要像草图中的虚线这样的连接时,导航这个结构是很痛苦的。如果您必须在顶部显示具有几个解决方案特征的图像,您首先必须遍历分析对象以查找其中哪些基于该图像,然后遍历解决方案以显示它们。
  2. 如果要解决 1. 您选择显式存储虚线链接(即图像类将具有指向与其相关的解决方案特征的指针),您将付出很大的努力来保持这些指针的一致性并在某些情况发生变化时不断更新链接.

我的想法

我想建立一个更可扩展(2)和灵活(1)的数据模型。第一个想法是使用关系模型,分离对象及其关系。为什么不在这里使用 RDBMS - sqlite 对我来说似乎是一个合适的引擎。因此,复杂的关系可以通过数据库上的简单(左)JOIN 访问:伪代码“ images JOIN images_to_image_features JOIN image_features JOIN image_features_to_objects JOIN objects JOIN solutions JOIN solution_features”),然后按 ID 从全局存储中获取解决方案功能的实际 C++ 对象。

问题

所以我的主要问题是

  • 使用 RDBMS 是解决我所描述的问题的适当解决方案,还是不值得并且有更好的方法在我的应用程序中组织信息?

如果 RDBMS 没问题,我将不胜感激有关使用 RDBMS 和关系方法存储 C++ 对象关系的任何建议。

4

4 回答 4

4

您可能希望了解语义 Web 技术,例如 RDF、RDFS 和 OWL,它们提供了另一种可扩展的世界建模方式。有一些开源的三重存储可用,一些主流的 RDBMS 也有三重存储的能力。

特别是看看曼彻斯特大学 Protege/OWL 教程: http: //owl.cs.manchester.ac.uk/tutorials/protegeowltutorial/

如果你认为这个方向值得进一步研究,我可以推荐“工作本体论的语义网”

于 2012-08-27T11:04:56.527 回答
3

仅基于该图,我建议 RDBMS 解决方案确实可行。自从我成为 RDMS(当然称为 RDM!)的开发人员以来已经有好几年了,但是我能够更新我的知识并获得非常有价值的数据结构和布局的见解,这些见解与您通过阅读神话般的描述非常相似Stephane Faroult 所著的《SQL 的艺术》一书。他的书将大大回答您的问题。

我在亚马逊上包含了一个链接,以确保准确性:http ://www.amazon.com/The-Art-SQL-Stephane-Faroult/dp/0596008945

阅读它不会出错,即使它最终并没有完全解决你的问题,因为作者在清晰地分解关系并提出优雅的解决方案方面做得非常出色。这本书不是 SQL 手册,而是对如何思考数据以及数据如何相互关联的深入分析。一探究竟!

使用 RDBMS 跟踪数据之间的链接可能是一种有效的方式来存储和考虑您正在寻找的分析,并且链接是“软的”——也就是说,当它们链接的硬对象被删除时,它们就会消失。这确保了数据的完整性;Fauroult 女士可以回答如何确保这仍然正确。

于 2012-08-24T16:26:59.210 回答
1

根据您对可扩展和灵活模型的要求,我不推荐 RDBMS。

  1. 每当您更改数据模型时,都必须更改数据库模式,这可能比更改代码涉及更多的工作。
  2. 数据库查询的任何问题仅在运行时才被发现。这会对维护成本产生很大影响。

我强烈建议使用带有 STL 的标准 C++ OO 编程。

  1. 您可以利用封装来确保正确完成任何数据更改,并更新相关对象和索引。
  2. 您可以使用 STL 在数据上构建高效索引
  3. 您可以创建外观来轻松获取信息,而不必访问多个对象/集合。这将是一次性工作
  4. 您可以制作单元测试用例以确保正确性(与使用数据库的单元测试相比要简单得多)
  5. 您可以利用多态性来构建不同类型的对象、不同类型的分析等

所有非常基本的点,但我认为如果您改进当前的解决方案而不是寻找基于数据库的解决方案,您的努力将得到最好的利用。

于 2012-08-29T05:32:46.787 回答
1

http://www.boost.org/doc/libs/1_51_0/libs/multi_index/doc/index.html

“你会付出很多努力来保持这些指针的一致性,并在发生变化时不断更新链接。”

在 Boost.MultiIndex 的帮助下,您可以在“表”上创建几乎所有类型的索引。我认为引用的问题没有那么严重,因此原始解决方案是可以管理的。

于 2012-08-25T06:26:15.657 回答