【发布时间】:2021-04-17 23:03:17
【问题描述】:
假设您有一个包含大量用户的数据库,并且您需要存储随机数量的随机键值对。每个用户都可以有一组可变(非常可变)的对,并且密钥可以彼此完全不相关,但也可以重复。此外,键值对经常被写入,但大多数情况下,用户读取时会同时读取他们所有的键值对。每个用户的键值对可以达到数千个,但如上所述,它实际上可以是可变的(可以是 1,也可以是 1000)
到目前为止,我已经得出了三种可能的解决方案:
- 用户表中存储 JSON(或其他合适的序列化)的列,表示为该用户设置的键值对。可能是最好的阅读方式,但我担心插入
- 一个“keyvalue”表,其列包含用户 ID、键为 VARCHAR 和值。
- 两个表,一个称为“keyname”,key_id 为 INT,key_name 为 VARCHAR,以及从第 2 点开始的 keyvalue 表,但使用 key_id 而不是 key。
哪一个是 MySQL 中性能最好的(或者是否有比这些更好的选择)?哪些优化可以应用于数据库以使其更好地工作? (视图、索引等)
【问题讨论】:
-
EAV 看起来像合适的模式。 我担心插入 JSON_MERGE() 或 JSON_MERGE_PATCH()。
-
您几乎列出了您拥有的选项(您缺少的选项是使用 nosql 解决方案,它更适合此类要求)。问题是:我们无法告诉您哪一个最适合您的特定要求和基础架构!您需要测试解决方案并选择最适合您要求的解决方案。您写道您担心 json 数据的插入。对其进行测试可以确认或反驳您的担忧,而不是依赖于人们的话语,他们可能对您的系统一无所知。
标签: mysql optimization