搜索为主的数据库如何选型与构造表结构

发布于 2022-09-06 03:22:41 字数 1233 浏览 16 评论 0

假设现在有一个数据结构如下的数据源

[
    {    
        id: 1,
        name: '小明',
        price: 300,
        data: [
            {
                id: 10003,
                name: '屠龙宝刀',
                num: 100
            },
            {
                id: 10004,
                name: '无尽之刃',
                num: 100
            }
            {
                ......
            }
        ]
    },
    {    
        id: 2,
        name: '小红',
        price: 300,
        data: [
            {
                id: 10003,
                name: '屠龙宝刀',
                star: 5,
                num: 100
            },
            {
                id: 10004,
                name: '无尽之刃',
                star: 3,
                num: 100
            }
            {
                ......
            }
        ]
    }
    {
        ..........
    }
]

如以上结构,假设有200万条游戏账号数据,怎样设计数据库和表才能使搜索速度尽可能快,要求能搜索出拥有 m 个“屠龙宝刀” 和 n 个“无尽之刃”的账号。

我现在想了几种方案

  1. 关系表

    account(账号)表,一个data(装备)表,一个rel(关系)表,但是关系表的条数是 账号数 * 每个账号的物品数, 至少是三四千万。

  2. 全文搜索
    一个account(账号)表,一个data(装备)表,账号表里,用一个字段存物品的字符串,采用全文搜索
  3. mongodb 没接触过,但是听说可以直接存json,而且便于检索

各位大佬有没有更好的方法,先在此谢过,采纳的可以私信发个红包

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

不再见 2022-09-13 03:22:41

用MongoDB的话,你题目中的数据结构就可以很好地表达你需要的数据。

搜索出拥有 m 个“屠龙宝刀” 和 n 个“无尽之刃”的账号。

这个搜索可以用:

db.table.find({
    $and:[
        {data: {$elemMatch: {name: '屠龙宝刀', num: m}}},
        {data: {$elemMatch: {name: '无尽之刃', num: n}}},
    ]
});

为了查询更快,需要索引:

db.table.createIndex({"data.name": 1, "data.num": 1});
¢蛋碎的人ぎ生 2022-09-13 03:22:41

用MySQL就足够了,道具持有表user_item只需要3列:


uid, // 用户ID
iid, // 道具ID
icount, // 道具数量
PRIMARY KEY (uid, iid),
KEY (iid, icount) // 根据道具数量查找用户可利用此索引

要求能搜索出拥有 m 个“屠龙宝刀” 和 n 个“无尽之刃”的账号为例:

  • 先搜索出拥有 m 个“屠龙宝刀”的帐号:SELECT uid FROM user_item WHERE iid = i_屠龙宝刀 AND icount >= m
  • 再搜索出拥有 n 个“无尽之刃”的帐号:SELECT uid FROM user_item WHERE iid = i_无尽之刃 AND icount >= n

两个uid列表用程序取交集就可以了。当然,也可以直接在MySQL中做INTERSECT操作(不太推荐)。

只存3个INTEGER的话,三四千万对MySQL毫无压力。
再多些的话,可以考虑按uid或iid水平分库。

记忆里有你的影子 2022-09-13 03:22:41

虽然赞了楼上的mongodb的示例,但是,我平时都是用elastic search专门做搜索的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文