我应该使用哪个本地数据库与React Native一起使用?

18

我是React Native的新手,我需要一个本地数据库工具列表,这个列表需要符合以下描述的最低标准。

如果这是一个PHP/MySQL应用程序,我会创建3个数据库表:

t_food (500 rows)
- food_id (primary_key)
- food_name (string)

t_meal (100 000 rows)
- meal_id (primary_key)
- meal_name (string)

t_meal_item (1 000 000 rows)
- meal_id (foreign_key)
- food_id (foreign_key)

这三个MySQL表的总大小约为10MB到15MB。然后我将使用PHP创建一个界面,以呈现此查询的结果:

SELECT meal_id FROM t_meal_item WHERE food_id = @food1 AND meal_id IN (SELECT meal_id FROM t_meal_item WHERE food_id = @food2 AND meal_id IN (SELECT meal_id FROM t_meal_item WHERE food_id = @food3))

在一个MySQL/PHP应用程序中,SQL查询的结果将在2秒内返回。

在React-Native世界中,我需要一个本地数据库,其实现类似于上述内容,但还必须符合以下要求:

  1. 必须支持15 MB的持久存储(以便在没有互联网访问的情况下使用)

  2. 按3种食物过滤的餐点查询必须在现代主流移动设备上的小于3秒内完成。例如,在iPhone 6和Huawei Nova Plus上,等同于上述SQL查询的查询必须在3秒内完成。

我已经尝试了以下方法:

A. Realm在标准2上失败,如此问题所示:

Improve the speed of a realm query in react-native?

Realm问题的解决方案将是对此问题的可接受答案。

B. 六年前,我在iOS设备上尝试了Core Data。由于内存不足,iOS设备一直崩溃。

C. 我正在尝试SQLite Storage,但已经遇到了这个问题:

basic React Native SQLite script returning undefined which causes error

哪些工具可以解决这个问题?


我该如何提高问题的质量,以避免被关闭或者获得负评?我只是在询问通常用于解决我所提出问题的工具。我的问题应该很普遍,因为有常见的方法来解决它,而不是任何有争议的东西。 - John
我没有给你的问题投反对票或者举报它,但是我认为这是因为这个问题的答案非常基于个人观点,因为每个开发者在处理数据时都有不同的方法。你真的有很多选择,因为你可以选择在线数据库,比如Firebase或Realm(也可以离线工作),或者传统的数据库,比如SQLlite,甚至是一个静态的数据数组插入到应用程序本身中。每一种方法都有积极和消极的一面,选择其中一种方法基本上取决于开发者的个人喜好。 - bennygenel
@bennygenel 谢谢,这正是我在寻找的,一个解决问题常用工具列表。您有经验知道我处理的数据量是否会成为问题吗?五年前,我记得在本机iOS上尝试处理t_meal_item中一百万条记录时遇到了性能问题。在您提到的任何这些新技术中都不会成为问题吗? - John
1
我从未尝试过在本地存储如此多的信息,所以对此我无法发表任何评论,但我可以说,在5年内发生了很多变化。我认为您应该做一个小型测试项目,并测试您拥有的所有选项,然后自行决定。 - bennygenel
这里明确禁止工具推荐请求。请参见https://stackoverflow.com/help/on-topic中“一些问题仍然是不适合讨论的”部分中的第4条。 - Charles Duffy
显示剩余5条评论
5个回答

10

我大部分时间都没有互联网访问。所以Restful API不会有用。 - John
你可以在这里查看:https://dev59.com/e10b5IYBdhLWcg3wVv-9 - Mohamed Khalil
我更新了我的问题以说明性能要求。我已经尝试过 Realm,尽管被誉为 React Native 中最快的数据库之一,但它已经远远不能满足我的性能要求。在逐个评估每个本地数据库之前,您是否知道您列出的选项中是否有任何一个能够满足指定的性能要求?我不想探索死胡同的选择。 - John
1
MongoDB很快,但它不是SQL数据库。SQLite基于SQL,但性能较差。忽略Redux Persist,因为它在处理小数据时效果更好,而不是大数据。 - Mohamed Khalil
谢谢,也许你对我的SQLite存储问题有一些见解?https://stackoverflow.com/questions/46459063/basic-react-native-sqlite-script-returning-undefined-which-causes-error - John
我正在尝试使用react-native-local-mongodb,但它还不够可靠。但是欢迎大家帮忙解决一些bug。它很有前途。 - Manuel Hernandez

6
我没有使用其他人列出的数据库,但是我建议使用Realm。 它非常有用,速度快,与react-native完全集成,并且文档非常完善。 https://realm.io

1
我尝试了Realm,但是我遇到了性能问题,就像这个问题所描述的那样:https://stackoverflow.com/questions/46394870/improve-the-speed-of-a-realm-query-in-react-native。你知道如何提高Realm查询速度吗?否则,Realm将不是一个合适的解决方案。 - John
@John,抱歉回复晚了。你尝试过在发布模式下运行吗?在调试模式下速度确实很慢,但是当你切换到发布模式时就不会感到任何缓慢了。 - ital0
所有真正的产品都有云组件。我错了吗?我只想要本地设备存储。 - Manuel Hernandez
@ManuelHernandez,您可以使用realm-js来完成这个任务。 - ital0
谢谢,但我发现我能够使用两个对象数组,过滤器,映射和在AsyncStorage上持久化来设置足够好的CRUD操作。示例有点冗长,因此这是一个要点 https://gist.github.com/ConnectedReasoning/262e081e6a8736914507cb5fe02e0a82 如果您的数据需求很简单,我建议使用此方法。 - Manuel Hernandez

1

我更新了我的问题以说明性能要求。我已经尝试过 Realm,尽管被誉为 React Native 中最快的数据库之一,但它已经远远不能满足我的性能要求。你知道 SQLite 是否能够满足我的性能要求吗?我在一些博客中读到它可能无法满足,所以不想浪费时间探索无用的选项。 - John
@John,如果使用得当,SQLite真的非常快。除了并发之外,它落后于大型数据库的唯一领域是它没有重型查询优化器,但这只意味着你(用户)需要构建优化的查询。 - Charles Duffy
1
@DanielMedina 谢谢,你知道如何解决这个问题吗?https://stackoverflow.com/questions/46459063/basic-react-native-sqlite-script-returning-undefined-which-causes-error - John

1

截至目前,WatermelonDB似乎满足了大小限制和性能要求。

Realm现在是商业化的,并且与MongoDB及其云服务紧密耦合(或者至少从文档中看起来是这样)。

我也简单地查看了PouchDB,但它的一个react-native集成stockulus/pouchdb-react-native基于AsyncStorage(根据我的经验非常缓慢),另一个craftzdog/pouchdb-react-native则基于sqlite,但最近几年没有活动。


0
根据我的经验,这完全取决于应用程序的要求。如果您的应用程序不是大规模的,您可以使用React Native的默认异步存储;如果您正在使用redux,则可以使用redux-persist并提供它的异步存储插件,以便自动持久化您的reducers。
在其他情况下,如果您有一个大规模的应用程序,并且您非常关注数据库,那么您应该使用WatermelonDB,因为它是React Native可用的最佳数据库。它还提供同步功能,通过它,您可以创建一个在线/离线应用程序,并自动将数据库同步到后端。WatermelonDB也在其后端使用SQlite来存储数据,但它更强大和有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接