当前位置: 首页 > 知识库问答 >
问题:

将字段值存储为JSON数组而不是创建新表和一对多关系打赌有什么优点/缺点吗?

廖永长
2023-03-14

假设每个用户都有一些数字(例如网络游戏中道具的ID)存储在数据库中。

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

CREATE TABLE user_numbers (
    userid INT,
    user_number,
    FOREIGN KEY (userid) REFERENCES user_info(id) ON DELETE CASCADE
);

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

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

共有2个答案

史弘致
2023-03-14

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

是的,将数字存储在像“['1','2','3']”这样的数组字符串中是您个人的选择。但就我个人而言,我不建议使用这种方法来存储数据,因为可能需要对其进行一些算术运算,或者可能需要基于该数据搜索结果,在这种情况下,可能需要对其使用一些函数和索引。所以,如果您存储这样的字符串,那么您将无法执行这样的操作。

魏学智
2023-03-14

根据我的经验,这在很大程度上取决于存储的数据。两种方式都有优点和缺点。如果这是一个MMORPG网络游戏,那么就说你有一台带腰带的电脑。PC可以在腰带中放入药水,以便在战斗中快速获取。所以我们想保存储存在角色腰带中的药水的标识。

最常见的请求是“获取角色X拥有的所有药剂”。在这两种情况下都会运行得很快。

将这些药水ID存储为单独的表的好处:

  • 你可以搜索一个特定的药水ID,它非常快。游戏内示例:管理员已经从游戏中删除了一些药水,因此您需要更新每个人的腰带
  • 你可以得到一些很好的统计数据。游戏内示例:寻找所有玩家中使用最多的药水
  • 数据库将保持数据完整性。游戏中的例子:当你使用药水时,你永远不会遇到游戏说“哎呀,带有那个id的药水不存在”的情况
  • 这对一致性有好处。游戏中的例子:你从腰带上拿了一剂药水,把它放进背包里。游戏可以通过调用带有两个简单的明确SQL语句的事务来实现它。
  • 你可以做JOIN。游戏中的例子:我们需要在腰带中获得药水的列表,以及它们的名称、重量和图像,这些都存储在单独的表中。
  • 您可以更新单个项目,而不需要更新整个腰带。游戏强制示例:你腰带里有一百万种药水,你喝了一种。

存储为json的好处:

  • 如果这是一个在客户端使用javascript的浏览器游戏,那么你可以通过一个简单的请求来获得皮带json对象,而不是执行选择查询,然后转换为json
  • 维护项目的顺序要容易得多,因为json数组已经被排序了。使用表方法,您需要额外的名为“订单”的列,并每次更新它,检查两个项目是否有相同的顺序等。
  • 您可以在客户端的皮带中进行一系列重排,然后单击“应用”-繁荣,只需一个查询即可更新整个皮带。而使用table方法,您至少需要两个查询(DELETE INSERT)
  • 除此之外,流行的DBMS在数据库中有支持json函数的插件

一句话:这些不是主要优势,也不是关键问题。所有这些问题都是可以解决的,只要应用程序设计得当,两种解决方案都能正常工作。在决定如何存储数据之前,问问自己,这些数据最常见的用例是什么,然后选择解决方案。

 类似资料:
  • 我当前有一个查询,用于在Men节点和People节点之间建立关系: Mem节点包含一个personid数组,我正在展开该数组,然后将其与personid节点对应。但是,查询正在与它创建的新Person节点建立关系,只使用相应的PersonId属性(而不使用其他属性),而不是与具有相应PersonId的现有Person节点建立关系。 即使我对带有Person标签的节点的personID属性有一个唯一

  • 本文向大家介绍什么是ajax和json,它们的优缺点相关面试题,主要包含被问及什么是ajax和json,它们的优缺点时的应答技巧和注意事项,需要的朋友参考一下 ajax的全称:Asynchronous Javascript And XML。 异步传输+js+xml。实现无刷新状态更新页面和异步提交 所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,

  • 指向列表中的下一个节点而不是 我明白,最好使用指针版本;我不打算争论事实,但我不知道为什么这样更好。关于指针如何更好地分配内存,我得到了一个不太清楚的答案,我想知道这里是否有人能帮助我更好地理解这一点。

  • 问题内容: 只是想知道TreeSet的优缺点是什么,是否有人可以告诉我?谢谢! 问题答案: 收藏类之一。它使您可以按键或按键顺序访问集合中的元素。它比ArrayList或HashMap具有更多的开销。当您不需要顺序访问时,只需按键查找即可使用HashSet。使用ArrayList并使用Arrays。如果只想按顺序排列元素,则排序。TreeSet始终保持元素顺序。使用ArrayList,您可以在需要

  • 面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: 第一,你知不知道你们系统里为什么要用消息队列这个东西? 不少候选人,说自己项目里用了 Redis、MQ,但是其实他并不知道自己为什么要用这个东西。其实说白了,就是为了用而用,或者是别人设计的架构,他从

  • 本文向大家介绍Fetch和Ajax比有什么优缺点?相关面试题,主要包含被问及Fetch和Ajax比有什么优缺点?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: promise方便异步,在不想用jQuery的情况下,相比原生的ajax,也比较好写。