在MySQL数据库中存储JSON数组数据是否可行?

4
我有一个独特的情况。我的网站用户可以提交文章供其他用户审查,但他们可以通过年龄和国家限制谁可以审查这些文章。我的问题是,我认为将所有250个国家(或任何想要向其他用户公开的国家)以JSON格式存储在数据库的文本字段中,比拥有250条记录(每个国家链接到文章的一条记录)更合适。这样,我只需要一条记录来存储每篇文章。我不确定性能是否会受到严重影响?该网站将处理1-2百万用户,并且提交审查的文章数量也将相当大。唯一的“处理”是将每个用户的国家存储在数据库中,并检查该用户是否被允许审查文章的国家数组。

你们觉得呢?对于每篇文章而言,我考虑的250条记录是否太多了?

7个回答

5

我认为将数据存储在查找表中是完全可以接受的。如果有任何更改,它会给您未来带来更多的自由度,只要您很好地索引了表,性能就不会受到太大影响。

Mysql轻松处理数十亿条记录的数据。是的,您需要确保维护数据的完整性 - 但与更改存储在每个记录中的对象相比,向查找表添加列似乎更容易。

只需确保您正确地保留数据 - 即您不会重复不必要的信息。将国家保存在一个表中,并在查找表中引用一个简单的ID。


3
简言之,如果您不会根据该列查询数据,则在关系型数据库中存储Json数据是可以的。
如果您需要根据该列查找数据,则在排除数据之前解析json将导致巨大的性能损失,因此这是不可行的。
我们在工作中遇到了这个问题,但规模较小,在数据库中存储属性的json已经很好地解决了非搜索属性的复杂性。

1
我会使用另一个表格来存储这些数据,并创建一个唯一的列来匹配它。

1
你有一个“国家”表和一个“文章”表。我会创建第三个“国家-文章”表,仅包含应该匹配的索引。毕竟Mysql是关系型数据库。 如果你担心性能问题,可以进行基准测试。

0

一个选项可能是使用位域来表示您的国家,使用MySQL bitbinary类型。这将允许您在单个位中存储每个国家的信息,这只需要每个记录额外的32个字节(8位/字节* 32字节= 256位)。

我不确定,但可能甚至可以使用按位操作进行查询,这可能非常快速。


要存储256位,需要32字节。 - CyberDem0n
糟糕,真不敢相信我犯了那个错误。我比想象中更累了。 - Gordon Bailey

0

你可以为国家单独创建一个表格,并将它们的ID与文章表格一起存储。

你可以在国家表格中存储所有国家、亚洲、欧洲、北美洲、南美洲等选项。


0

JSON可以防止DBMS检查您希望存储的国家的有效性。它基本上是一个不透明的文本,因此DBMS无法强制执行引用完整性(外键)。

即使您不需要查询国家(这是一个相当大的“如果”),您至少需要在检查特定国家之前解析JSON。

JSON可以很好地匹配分层数据,但这只是一个简单的集合(一个国家要么是集合的元素,要么不是),可以通过单独的连接表ARTICLE_COUNTRY来很好地表示,然后可以高效地进行维护和搜索:

enter image description here

这个连接表只会链接到那些可以访问文章的国家。如果大多数文章都可以从大多数国家访问,甚至可以反转连接表的含义,只存储“禁止”国家,从而降低总行数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接