我正在编写CAD(计算机辅助设计)应用程序。我需要用这个产品发送一个3d对象库。这些是由3d坐标组成的简单对象,其中不超过300个。
我正在考虑为此目的使用关系数据库。但鉴于我的简单需求,我不希望任何事情变得复杂。直到现在,我倾向于SQLite。它很小,在客户端进程中运行并声称速度很快。此外,我是一个穷人,而且是免费的。
但在我致力于SQLite之前,我只想问你的意见,根据我的要求,这是否是一个不错的选择。在作出决定之前,我还应该尝试一下吗?
修改:
我之前没有提到我将发布的上述CAD对象不会是不可变的。我希望用户编辑它们(更改尺寸,颜色等)并保存回库。我还希望用户添加他们自己新创建的对象。请在答案中考虑这一点。
(感谢目前为止的答案。)
答案 0 :(得分:3)
真正需要考虑的是你的程序对数据的作用。关系数据库旨在处理数据集之间的复杂关系。但是,它们并非旨在执行复杂的计算。
此外,数据量和相对简单性告诉我,您可以简单地使用平面文件来存储坐标,并在需要时将它们读入内存。通过这种方式,您可以设计数据结构,以更准确地反映您将如何使用这些数据,而不是如何存储它。
许多语言提供了一种机制,可以将数据结构写入文件并再次将其读回,称为serialization。 Python的pickle就是这样一个库,我相信你可以找到任何一种语言。基本上,只需根据程序使用它们的方式设计类或数据结构,并使用其中一个序列化库来填充该类或数据结构的实例。
编辑:结构可变的要求对我的回答并没有太大影响 - 我仍然认为序列化和反序列化是解决这个问题的最佳方法。用户需要能够修改和保存结构这一事实需要进行一些规划以确保文件完全正确地更新,但最终我认为您最终会花费更少的时间和精力来使用这种方法而不是尝试将SQLite或其他嵌入式数据库编组为你做这项工作。
数据库更好的唯一情况是,如果您有一个多个用户正在与一个中央数据存储库进行交互并更新中央数据存储库的系统,对于像您这样的情况,您将查看像MySQL这样的数据库服务器, PostgreSQL,或速度和并发的SQL Server。
您还评论说您将使用C#作为您的语言。 .NET支持序列化built in,因此您应该good to go。
答案 1 :(得分:1)
我建议您考虑使用H2,它非常轻巧,快速。
答案 2 :(得分:1)
当你说你将拥有一个包含300个3D对象的库时,我会假设你的代码是代码的对象,而不是用户将创建的模型。
我读过object databases非常适合帮助解决CAD问题,因为它们非常适合追逐复杂模型特有的长参考链。也许类似db4o的内容在您的上下文中会很有用。
答案 3 :(得分:0)
您运送了多少件物品?你能在xml文件中定义这些对象及其坐标吗?那么基本上为每个对象使用一个不同的xml文件?您可以将这些xml文件放在目录中。这可以是一个简单的结构。
答案 4 :(得分:0)
我不会使用SQL数据库。您可以使用XML文件轻松描述每个3D对象。将此文件打包到目录中并打包(zip)全部。如果您需要轻松访问对象的元数据,您可以生成索引文件(仅包含名称或描述),因此不是所有对象都必须被解析并加载到内存中(如果您有类似库管理器的东西,那就很好)
有快速简便的SAX解析器,您可以轻松编写XML编写器(或者找到一些可用于此的免费代码)。
今天使用XML的许多类似应用程序。它很容易解析/写入,人类可读,如果压缩也不需要太多空间。
我使用过Sqlite,它易于使用且易于与自己的对象集成。但我更喜欢像Sqlite这样的SQL数据库,对于那些需要一些很好的搜索工具来处理大量数据记录的应用程序。
答案 5 :(得分:0)
对于特定的要求,即提供应用程序附带的对象库,数据库系统可能不是正确的答案。
首先要想到的是,您可能希望文件可更新,即您需要能够将文件删除并更新到应用程序中,而无需更改应用程序的其余部分。
第二件事是您发送的数据是不可变的 - 因此,您不需要关系数据库的功能,只是为了能够以足够的效率访问特定模型。
为了简单(某种程度),XML文件可以很好地完成,因为你有很好的结构。以此为基础,您可以选择压缩,加密,将其作为资源嵌入程序集(如果在.NET中播放)等等。
显然,如果SQLite将其数据存储在单个文件每个数据库中,并且如果您有其他原因需要在存储系统中使用db的功能,那么是的,但我想考虑一下数据库作为一个整体首先应用于应用程序。
答案 6 :(得分:0)
SQL Server CE是免费的,占用空间小(没有服务运行),并且与SQL Server兼容