2016-08-15 69 views
1

我目前在数据建模上苦苦挣扎。某些表格中有超过100万条记录,需要相当长的时间才能通过GROUP BYCOUNT查询输出。所以我转移到Couchbase,因为它支持查看和索引,我发现查询数据更快。在关系数据建模和文档数据建模之间挣扎

MySQL中有一个很大的优势,我发现它非常有用。比如我在用户表中有一个用户和一些与这个用户相关的文章,也有一些来自许多其他用户的与本文相关的喜欢和评论。我通常做一个JOIN,所以输出会给我带有用户名和个人资料图片的文章。输出还附有其他用户的详细信息,包括喜欢和评论。因此,如果用户上传新的个人资料图片或更改了他的电子邮件地址,我只需要更新users表中的列。

在Couchbase中,我试图创建文档,因为我将数据存储在MySQL中,因此文章文档的作者为user_id,评论文档有commenter_idarticle_id。现在我发现在启用了限制和排序的情况下将它们加入视图或索引非常困难。所以我复制了用户的profile_imgfirst_namelast_name到所有相关文件。所以,当我加载文章文档具有以下结构:

{ "article_id": 1234, "text": "A good article", "author_id": 1, "first_name": "John", "last_name": "Smith", "profile_img": "0bf34ee0a.jpg", "likes": [ { "user_id": 1, "first_name": "John", "last_name": "Smith", "profile_img": "0bf34ee0a.jpg" }, { "user_id": 2, "first_name": "Paul", "last_name": "Einstein", "profile_img": "1789ab00ef.jpg" } ] "comments": [ { "user_id": 1, "first_name": "John", "last_name": "Smith", "text": "This is my article", "profile_img": "0bf34ee0a.jpg" }, { "user_id": 2, "first_name": "Paul", "last_name": "Einstein", "text": "i like it", "profile_img": "1789ab00ef.jpg" } ] }

这无疑救了我的查询时间。 (否则,我必须先查询文章,从文章和喜欢和评论中提取用户ID,并根据用户ID查询用户附加用户详细信息到文章以及喜欢和评论)。但是这给我带来了另一个问题,如果用户更新他的个人资料图片,我必须抓取所有文章才能找到他的user_id并更新profile_img字段。

任何人都有我应该走哪条路线的线索?

+0

我不明白这里复杂的只是存储的用户ID,关键词,全文检索或'solr'整合。我看不到一个数百万行的mysql解决方案是如何对索引进行调整并不是一个尖锐的快速解决方案。特别是如果你避免blob – Drew

+1

你不能只是采取SQL建模,并将其转换为任何NoSQL /文档数据库解决方案。 一个严肃的解决方案应该涉及到对数据的重新思考。 这主要是因为这些平台倾向于解决不同的问题。 –

回答

1

阅读this blog post并看看这是否回答你的一些问题,如果不是让我们继续谈。

对于上面的对象模型,将喜欢和评论嵌入到用户文档中从长远来看可能是一个坏主意。虽然是的,但您可以使用sub-doc API读取/写入JSON的一部分,您通过复制等方式在后端付费,但随着时间的推移,它还会涉及到文档大小。更可能的是,将每个用户的喜好和评论放入他们自己的文档中会更好。即使那样,你也不得不满足活跃用户文档的增长情况。

另一件事。评论和喜欢应该与正在评论的内容或用户评论和喜好相关吗?可能值得每个评论都在自己的对象中使用标准化的关键模式来标识它,然后让另一个对象是所有那些对该原始想法进行评论的对象ID的数组。同样的喜欢。你做什么取决于你将如何访问数据,特别是你的应用程序的性能和扩展需求。我的意思是一个模式设计决定,你为一个系统每秒只能执行500次操作的系统设计决定可能与每秒执行200,000次操作的系统设计决定非常不同。访问NoSQL数据库中的数据与RDBMS相比的主要区别在于,使用NoSQL对数据进行模型化非常容易,因为您的应用程序和用户将如何使用这些数据,而在RDBMS中,您必须多次对什么是数据进行建模最适合数据库引擎以及它如何存储和使用数据。

另外,请阅读this postthis one。请记住,高写入率的后一篇文章是在Couchbase的N1QL之前编写的,但它应该给你一些想法,无论如何。