2014-02-27 49 views
0

我要开始一个大的3D模型化项目,我需要选择一个系统来存储我的数据。在我的引擎处理之前,原始格式的3D模型由数十亿个彩色三角形组成。 输入: - 每个3d模型将包含大量的三角形(3个空间点(bigint x,y,z)和颜色(rgb))。 - 如果INSERT速度慢,这不是什么大问题,但是SELECT必须尽可能快(SELECT有一些线性的WHERE条件)。 - 数据一致性并不重要,如果我在模型中丢失了一个三角形或两个不太成问题的数据。 - 我可以为每个对象创建一个表,所以我可以使其成为只读,并且可以在其上放置一些列索引(RDMS)。选择NOsql或RDMS,以及哪个DataStructure?

有我的问题: 数据结构: 许多三角形将共享相同的点。我是否应该将三角形保存在一个表中,如id x1,y1,z1 x2,y2,z2 x3,y3,z3,r,g,b;或者一个用于点id,x,y,z和一个三角形表的表格,dot1Id,dot2Id,dot3Id,r,g,b(我认为在亿行上的连接会很慢,而且对于NOsql,我们甚至不能如果我的记忆力不错,请加入...)

RDMS或NOsql? 我认为NOSQL对我所需要的产品很好,它是否能够快速有条件地选择非常大的数据? RDMS可以很好,因为我的数据格式很好,由整数组成,索引可以在这里做魔术。

回答

0

不是专家,我不能真正回答你的问题。但评论是简短的,给你适当的建议。所以这里是我在“答案部分”中的“评论”:-)

我理解模型,它由三角形的列表(或一组精确的)组成。您将始终需要阅读完整的数据才能加载模型。你不仅会加载三角形,其中x < 100和y> 1000或其他。

所以你对这个问题的想法很好。链接你的三角形是他们共享的点。所以是的,你可以使用RDBMS并将点存储在一个表中,并将它们的关联三角形存储在另一个表中。然而,RDBMS中的“指针”(在你的三角形表中指向你的点记录)通常很大(所谓的行ID),所以你不能真正节省空间,但需要重新构建所有的三角形从他们的相关点,这需要时间。我的建议:没有RDBMS。

如果上述假设是正确的,并且您的模型由随机顺序中的一组三角形组成,您可以轻松地将它们存储在文件中。在一些自定义的二进制格式中,文件会比较小。你甚至可以压缩它来使用较少的硬盘扇区。没有用来存储任何地方的关系,每个模型只有一个文件。你从头到尾阅读。它不能更快​​。

我不知道任何NoSQL数据库专门用于存储大型二进制文件。它唯一的任务就是给你一个模型的原始数据。我的意思是它只会为您省去考虑存储多个模型文件并再次找到它们的方法(并且可能会在适当的情况下执行压缩)。但是,将模型名称与文件名称一起存储可以在注册表,配置文件,小文本文件等等中完成。我认为没什么大不了的。所以我的第二个建议是不要使用NoSQL DBMS。但正如所提到的,我并没有对此进行说明,并且可能有专门研究这个(小)任务的dbms。

+0

我的3D模型将适用于像房屋,酒店这样的大型环境......因此,我经常会加载模型的一些三角形(前者为公寓房间),这就是为什么我需要过滤数据这可以使用DMS更快地完成。有时我的服务器会接收数据来更新3D模型,那么我将不得不进行一些搜索来查找哪些三角形需要拆分或合并,在内存中加载500MB文件并每次搜索都会很痛苦。 – user2425133

+0

啊,好吧,所以有更多的关系。房子,公寓,公寓的房间...然后是的,当然你可以使用dbms来存储这些关系。听起来像是个好主意:-)然而,三角形集仍然可以以二进制格式存储(在表格列或文件中)。至少在我看来,如果让数据库知道三角形的坐标是什么,那么它一无所获。 RDBMS可以完成这项任务。至于NoSQL,我不知道,没有经验。关于更新:加载一个房间的二进制数据,改变它,并再次存储新的二进制文件。 –

+0

对不起,我没有详细解释结构。我的3D模型非常庞大,例如整个房子,但我不知道制造房间或起居室的部分,这是一切的一个大模型。我谈到了房间,因为最终用户将使用web界面在模型中导航,所以我的服务器不会仅仅将十亿个三角形发送给WebGl,它只会发送应该可见的部分,因此数据库需要知道协调,这样我可以,只需一个线性条件Where,选择可见的三角形通过网络发送。 – user2425133