json mysql 判断值是否存在_关于mysql:将字段值存储为JSON数组是否存在任何优势/劣势,而不是创建新表和一对多关系?...

假设每个用户具有一些数字(例如,网页游戏中的道具的ID)以存储在DB中。

我看到一些实现将数字存储为用户信息表的一个字段中的JSON字符串(表示数组结构)。 但我的直觉是创建另一个如下表

CREATE TABLE user_numbers (

userid INT,

user_number,

FOREIGN KEY (userid) REFERENCES user_info(id) ON DELETE CASCADE

);

因为这是一对多关系的正式方式。

所以我想知道JSON方法有什么实际好处,或者它只是个人选择吗?

我倾向于以关系格式存储所有内容以开始。 如果(并且仅当)遇到严重的性能问题而无法使用更多/更好的硬件进行修复,请将其中的一小部分移动到非规范化形式。 这将阻止您加入并在SQL中搜索您JSONify的数据,因此这是一个权衡。 只在需要时才制作。

得到它了! 谢谢!@ _ @

可能会有所帮助:stackoverflow.com/questions/15367696/

根据我的经验,这几乎取决于存储的数据。两种方式都有优点和缺点。如果它是一个MMORPG网页游戏,那么说你有一个带腰带的PC。 PC可以将魔药放入腰带,以便在战斗中快速进入。所以我们想要保存那些存储在角色腰带中的魔药的ids。

最常见的请求是"获得角色X拥有的所有药水"。在这两种情况下,这都会非常快。

将这些药水ids作为单独的表格存储的好处:

您可以搜索特定的药水ID,速度非常快。在游戏中的例子:管理员已经从游戏中移除了一些药水,因此你需要更新每个人的腰带

你可以得到一些不错的统计数据在游戏中的例子:在所有玩家中寻找最常用的药水

数据库将保持数据完整性。在游戏中的例子:当你使用药水并且游戏说"哎呀,那种不存在该药水的药水"时,你将永远不会遇到这种情况

这有利于保持一致性。游戏中的例子:你从腰带上取下药水并放入背包里。游戏可以通过使用两个简单明确的SQL语句调用事务来实现它。

你可以做JOIN。在游戏中的例子:我们需要获取皮带中的药水列表以及存储在单独表格中的名称,重量和图像。

您可以更新单个项目,而无需更新整个皮带。在游戏中强迫的例子:你有一百万药水,你喝了一个。

存储为json的好处:

如果它是一个在客户端使用javascript的浏览器游戏,那么你可以通过一个简单的请求获取Belt json对象,而不是执行Select-query然后转换为json

由于json数组已经订购,因此维护项目的顺序要容易得多。使用表格方法,您需要额外的列"订单"并每次更新它,并检查两个项目是否没有相同的订单等。

您可以在客户端的Belt中进行一系列重新排列,然后单击"Apply" - boom,只需一个查询即可更新整个皮带。而使用表方法,您至少需要两个查询(DELETE + INSERT)

此外,流行的DBMS具有支持数据库中的json函数的插件

底线:这些不是主要优势,也不是关键问题。所有这些都是可以解决的,并且通过适当的应用设计,两种解决方案都可以正常工作。在决定如何存储数据之前,请问自己,这些数据最常见的用例是什么,然后选择解决方案。

非常感谢您的详细解释!@ _ @

So I'm wondering does the JSON methods has any practical benefits or it's just a personal choice?

是的,您可以选择将数字存储在数组字符串中,例如"['1','2','3']"。但我个人不推荐这种方式来存储数据,因为你可能需要对它进行一些算术运算,或者你可能需要根据这些数据搜索结果,在这种情况下你可能需要使用一些函数和索引。 。因此,如果您存储类似字符串,那么您将无法执行此类操作。

所以这是JSON方式的缺点。 它有什么优势吗?

如果您不希望将来任何一项操作,并希望只显示数据,那么性能当然会增加。

好的谢谢!@ _ @

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值