【发布时间】:2016-08-20 08:13:47
【问题描述】:
我目前正在为数据建模而苦苦挣扎。有些表的记录超过100万条,通过GROUP BY和COUNT查询输出需要相当长的时间。所以我搬到了 Couchbase,因为它支持视图和索引,我发现在查询数据时速度更快。
MySQL 有一个很大的优势,我发现它非常有用。比如我在 users 表中有一个用户和一些与这个用户相关的文章,还有一些来自许多其他用户的与这篇文章相关的喜欢和 cmets。我通常会做一个 JOIN,所以输出会给我带有用户名和个人资料图像的文章。输出还附有其他用户的点赞和 cmets 详细信息。因此,如果用户上传了新的个人资料图片或更改了他的电子邮件地址,我只需要更新 users 表中的列。
在 Couchbase 中,我尝试在将数据存储在 MySQL 中时创建文档,例如文章文档的作者为 user_id,评论文档的作者为 commenter_id 和 article_id。现在我发现在启用限制和排序的视图或索引中加入它们是非常困难的。所以我将用户的profile_img 和first_name 和last_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和likes和cmets,然后根据用户id查询用户附加用户详细信息到文章和likes和cmets)。但这给我带来了另一个问题,如果用户更新他的个人资料图片,我必须爬取所有文章以找到他的user_id 并更新profile_img 字段。
有人知道我应该走哪条路吗?
【问题讨论】:
-
我不明白这里仅存储用户 ID、关键字、全文搜索或
solr集成的复杂性。我看不出用索引很好地调整了数百万行的 mysql 解决方案如何不是一个非常快速的解决方案。特别是如果你避免斑点 -
您不能只采用 SQL 建模并将其转换为任何 NoSQL/文档数据库解决方案。一个严肃的解决方案应该涉及重新考虑您的数据。这主要是因为这些平台倾向于解决不同的问题。
标签: mysql couchbase data-modeling