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

Posted

技术标签:

【中文标题】将字段值存储为 JSON 数组而不是创建新表和一对多关系是不是有任何优点/缺点?【英文标题】:Is there any advantage/disadvantage of storing field value as a JSON array rather than creating new table and one-to-many relationship bet them?将字段值存储为 JSON 数组而不是创建新表和一对多关系是否有任何优点/缺点? 【发布时间】:2014-07-05 18:33:54 【问题描述】:

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

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

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

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

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

【问题讨论】:

我倾向于以关系格式存储所有内容。如果(且仅当)您遇到无法使用更多/更好的硬件解决的严重性能问题,请将其一小部分移动到非规范化形式。这将阻止您加入并在 SQL 中搜索您 JSONify 的数据,因此这是一种权衡。仅在需要时进行。 可能会有所帮助:***.com/questions/15367696/… 【参考方案1】:

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

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

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

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

存储为 json 的好处:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

所以这是 JSON 方式的一个缺点。有什么优势吗? 如果您以后也不希望它们中的任何一个操作并且只想按原样显示数据,那么性能当然会提高。

以上是关于将字段值存储为 JSON 数组而不是创建新表和一对多关系是不是有任何优点/缺点?的主要内容,如果未能解决你的问题,请参考以下文章

创建表和添加表约束

如何将数组存储到mysql中?

iOS 开发:我可以在 Core Data 对象中存储整数数组而不创建新表来表示数组吗?

为 WordPress 插件存储变量而不创建新表

查询数据库中指定字段中存储的json数据是不是包含某个值

将 Json 对象存储在 Mongoose 字符串键中