我目前正在做一个基于Android的项目。在不涉及太多细节的情况下,该软件将在定制设备上运行。硬件永远不会改变,而且永远是一样的。这是一个明确的加分:)
尽管如此,这个项目需要我们在设备上存储加载和加载的数据-在一些表中超过3m行。对于我们来说,SQLite可以很好地处理扫描这么多行,当我们开始执行复杂的连接以返回所需的所有相关数据时,问题就出现了。我们已经考虑过对数据库进行反规范化,但担心这会将数据库推到可用范围之外。
我们正在考虑使用面向对象的数据库,比如db4o或NeoDatis。我们希望通过存储对象,我们可以摆脱行级别的关系,并将它们存储在对象上(就像OOP一样)。问题是我们找不到任何与性能相关的基准(至少不是最近的基准),这些ODB在Android上运行和使用。
有没有人对Android上的OODB和/或存储和访问如此大量的数据有任何经验?如果是这样的话,您能提供的任何建议都将不胜感激。
--编辑
这是我们面临的问题的一个例子。这与我们的应用程序无关(我的保密协议说我不能发布任何具体的东西),但这个例子很好地代表了这个问题。
想象一下,我们正在构建一个应用程序来监控任何给定时间在新泽西收费公路上行驶的每一辆车。对于任何给定的汽车,我们需要跟踪汽车的制造商和型号,车内有多少人,以及车内人员的人口统计数据。所以基本上你最终得到的数据看起来像-
小汽车
id | color | make_id | in_toll_lane | model_id
制作
id |名称
模型
id |名称| make_id
car_person
id |年龄|性别| is_driver | car_id
toll_lanes
id | cars_in_line | ideal_cars_in_line | ideal_occupants
此数据将频繁更改。它也将变得相当巨大,因为毫无疑问,在任何给定的时间,都有很多人开车沿着新泽西州的高速公路行驶。
有了这些数据,我们需要能够按需拍摄任何在高速公路上驾驶的人的快照。我们还需要能够为所有正在驾驶的男性或收费公路上的所有女性拍摄快照。我们还需要能够按年龄,性别,制造商,型号等搜索。
现在想象一下,我们需要根据车内的人数、理想的乘员数量、已经排队的汽车数量和应该排队的汽车的理想数量来计算每辆车应该进入哪条收费车道。
这是一个非常简单的例子,尽管它很能代表我们的问题。
--结束编辑
提前感谢!
发布于 2010-12-02 00:57:26
这里有一些观察,尽管我怀疑它不会直接帮助你。
我认为主要的问题是:当事件生成或更改数据时,您是要通过应用程序运行时逻辑来发现复杂的关系,还是必须将数据转储到存储中,然后通过查询来发现意外的关系?
如果您的业务逻辑将填充模型,那么您可以轻松地为数据模型的不同切片创建基于模型的视图,例如,知道所有具有男/女司机的汽车的集合。在这种情况下,基本上,您的关系是半静态的,很少发生变化(而这些关系另一端的数据值可能变化很大)。如果是这样的话,为什么要尝试将数据存储在数据库技术中,这会迫使您不断地重新计算关系(连接)。这只是对CPU的浪费,这就是为什么当模型变得复杂时,您会看到性能很差的原因。因此,一旦您回答了这些问题,就会很清楚ODB或RDB是最佳选择。
现在的问题是,什么将在Android上运行并处理海量数据?这就是我想我无能为力的地方。我在Versant工作,他有( db4o和Versant ) ODB。现在db4o将在安卓上运行,但对于大数据来说,它真的是正确的选择吗?不是的。除非你有非常孤立的数据,这些数据可能在单独的数据库中,只能在隔离中访问,而且在我看来这不是你的情况。我们的另一个数据库,Versant并不意味着要处理近乎实时的海量数据,但只有客户端是100%的Java,服务器是用C编写的,所以它不能在Android上运行。
我认为你需要做一些研究,看看谁拥有ODB,它可以在Android上处理大量数据。
Best,-Robert
发布于 2010-12-01 10:07:29
实际上,您并没有过多地说明您的数据访问需求或数据加载。
如果您有3M个主行,然后是一堆较小的叶表,那么您可以通过在RAM中缓存所有叶表并手动“连接”它们来做得很好。许多系统的叶表非常小(特别是与主数据相比),因此将它们加载到RAM中,然后在加载行时简单地查找它们,这可能是一个很大的优势。
显然,您不会对主要的父子关系执行此操作,但如果您可以消除叶连接,那么一次读取将成为父表和子表之间的单个连接,而不是父表、子表和叶表之间的六个连接。
即使这并不适用于所有的叶表,但如果它对大多数都有效,它可能足以让您度过难关。
发布于 2010-12-02 03:00:56
db4o:我们所有的回归测试都在安卓上运行,因为我们认为安卓将成为db4o的一个非常重要的平台。
对于300万个数量级的对象,db4o的效果非常好。
我们正在对http://www.polepos.org/上的其他数据库进行基准测试,我们很快就会发布一个新版本的基准测试,在这个版本中,我们也会针对SqlLite运行复杂的设置。将基准测试移植到Android也是一个考虑因素。
如果连接正在毁掉您的性能,并且您有非常异构的数据,那么db4o可能比关系数据库工作得更好。
你的应用听起来很有趣。如果你需要帮助来评估db4o,尽管给我打电话。
https://stackoverflow.com/questions/4320493
复制相似问题