5

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

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

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

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

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

4

2 回答 2

5

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

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

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

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

存储为 json 的好处:

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

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

于 2014-05-17T11:02:26.977 回答
0

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

是的,将数字存储在像“['1','2','3']”这样的数组字符串中是您个人的选择。但我个人不会推荐这种方式来存储数据,因为您可能需要对其进行一些算术运算,或者您可能需要根据该数据搜索结果,在这种情况下,您可能需要使用一些函数和索引. 所以如果你存储这样的字符串,那么你将无法做这样的事情。

于 2014-05-17T10:16:21.543 回答