我正在构建我的网络应用程序的后端; 它将作为前端的API,它将用Python编写(确切地说是Flask).
在做了一些关于设计和实现的决定之后,我进入了数据库部分.我开始考虑NoSQL数据存储是否比传统的SQL数据库更适合我的项目.以下是一个基本的功能描述,应该由数据库处理,然后我可以提出一个关于我应该选择哪种类型的存储的优缺点列表.最后说一下为什么我考虑过RethinkDB而不是其他NoSQL数据存储.
API的基本功能
API包含只有少数车型:Artist
,Song
,Suggestion
,User
和UserArtists
.
我希望能够添加User
一些关联数据并将其链接Artist
到它.我想根据请求添加Song
s Artist
,并生成一个Suggestion
for User
,其中包含一个Artist
和一个Song
.
也许最重要的部分之一是Artist
s将定期链接到User
s(并且Artist
s也可以从系统中删除 - 因此也可以从s中删除User
- 如果它们不满足某些标准).Song
s也将动态添加到Artist
s.所有这些意味着User
s没有固定的Artist
s组,也没有Artist
固定的Song
s组 - 它们将不断更新.
优点
对于NoSQL:
灵活的架构,因为不是每个Artist
都有FacebookID或Song
SoundcloudID;
虽然是JSON API,但我相信我会受益于记录存储为JSON的事实;
我相信Song
s 的数量,但特别是Suggestion
s会提高很多,因此NoSQL会在这里做得更好;
对于SQL:
它固定的模式可以派上用场模型之间的关系;
Flask支持SQLAlchemy,它非常有助于定义模型;
缺点
对于NoSQL:
关系更难实现,更新模型事务就像涉及一些代码;
Flask没有任何包装器或模块来简化操作,因此我需要实现某种包装器,以帮助我在进行数据库操作时使代码更具可读性;
我不知道如何存储我的记录,特别是UserArtist
s
对于SQL:
操作很笨重,我必须定义模式,检查列是否有默认值,分配默认值,验证数据,开始/提交事务 - 我认为对于像API这样简单的事情来说太麻烦了;
为什么选择RethinkDB?
我已经考虑过RehinkDB可能为我的API实现NoSQL,原因如下:
它看起来比其他解决方案更简单,更轻巧;
它具有本机Python支持,这是一个很大的优势;
它实现了表连接和其他可以在我的API中派上用场的东西,它在模型之间有一些关系;
这是一个新的,我看到社区有很多暗示和爱.还有意愿不断添加利用数据库交互的新东西.
所有这些都在考虑之中,我很高兴听到有关NoSQL或SQL是否更适合我的需求的任何建议,以及两者上的任何其他赞成,当然还有一些我没有说明的事情的更正正常.
我在RethinkDB工作,但这是我作为网络开发人员的公正回答(至少我没有偏见).
从开发人员的角度来看,灵活的架构是很好的(在您的情况下).就像你说的那样,使用像PostgreSQL这样的东西,你必须格式化你从第三方(SoundCloud,Facebook等)提取的所有数据.虽然这不是一件很难做到的事情,但这并不是一件令人愉快的事情.
能够加入表格对我来说是自然的做事方式(比如用户/用户艺术家/艺术家).虽然您可以拥有一个用户将包含艺术家的结构,但是当您需要检索艺术家以及每个用户列表时,使用它将会令人不愉快.
第一点是NoSQL数据库中常见的东西,而JOIN操作更像是SQL数据库.您可以将RethinkDB视为提供每个世界最佳的东西.
我相信使用RethinkDB进行开发是简单,快速和愉快的,而这正是我作为Web开发人员所期待的.
但是,您可能需要一件事,即RethinkDB无法提供,即交易.如果您需要对多个表(或文档 - 如果您必须在用户之间转移资金)进行原子更新,那么使用PostgreSQL之类的东西肯定会更好.如果您只需要更新多个表,RethinkDB可以处理它.
就像你说的那样,虽然RethinkDB是新的,社区是惊人的,我们 - 在RethinkDB - 关心我们的用户.
如果您有更多问题,我很乐意回答:)