假设每个用户具有一些数字(例如,网页游戏中的道具的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方式的缺点。 它有什么优势吗?
如果您不希望将来任何一项操作,并希望只显示数据,那么性能当然会增加。
好的谢谢!@ _ @