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

lfr*_*ree 5 mysql json one-to-many storing-data

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

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

CREATE TABLE user_numbers (
    userid INT,
    user_number,
    FOREIGN KEY (userid) REFERENCES user_info(id) ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)

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

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

Rus*_*Bes 7

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

\n\n

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

\n\n

将这些 potion-id 存储为单独的表的好处:

\n\n
    \n
  • 您可以搜索特定的药剂 ID,而且速度非常快。游戏内示例:管理员已从游戏中删除了一些药水,因此您需要更新每个人的腰带
  • \n
  • 您可以获得一些不错的统计数据。游戏内示例:寻找所有玩家中最常用的药水
  • \n
  • 数据库将维护数据的完整性。游戏中的示例:您永远不会遇到当您使用药水时游戏显示“哎呀,具有该 id 的药水不存在”的情况
  • \n
  • 这有利于一致性。游戏中的示例:您从腰带上取出一瓶药水并将其放入背包中。游戏可以通过两条简单清晰的SQL语句调用事务来实现。
  • \n
  • 您可以进行 JOIN。游戏中的示例:我们需要获取腰带中的药水列表以及它们的名称、重量和图像,这些信息存储在单独的表中。
  • \n
  • 您可以更新单个项目,而无需更新整个腰带。游戏中的强制示例:你的腰带里有一百万瓶药水,而你喝了其中一瓶。
  • \n
\n\n

存储为 json 的好处:

\n\n
    \n
  • 如果它是一款在客户端使用 javascript 的浏览器游戏,那么您只需一个简单的请求即可获取 Belt json 对象,而不是执行 Select-query 然后转换为 json
  • \n
  • 维护项目的顺序要容易得多,因为 json 数组已经排序了。使用表格方法,您将需要名为“订单”的附加列,并每次更新它并检查两个项目是否具有相同的订单等。
  • \n
  • 你可以在客户端的Belt中做一堆重新排列,然后点击“Apply”\xe2\x80\x94繁荣,只需一个查询就可以更新整个皮带。而使用表方法,您至少需要两个查询(DELETE + INSERT)
  • \n
  • 此外,流行的DBMS都有支持数据库中json函数的插件
  • \n
\n\n

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

\n