【问题标题】:Database design - using JSON to store info数据库设计 - 使用 JSON 存储信息
【发布时间】:2017-02-28 10:10:59
【问题描述】:

我有一个列出露营地的数据库 有一个主表 tblSites,其中包含唯一数据,例如名称、坐标、地址等,还包括每个设施的列,例如厕所、水、淋浴、电气等,其中只有 1=Yes,Null=no 这将通过类似

的内容进行搜索

从 tblSites WHERE Water = 1 AND Toilets = 1 中选择 id

还有另一个相关的表 tblLocations 包含位置类型(即靠近大海、农村、山脉、河流等)。 这意味着该表有很多列,如果我想添加新类别,则不允许轻松更新。 这将包含在这样的搜索中

从 tblSites AS M 中选择 M.id、L.* LEFT JOIN tblLocation AS L ON M.ID = L.ID WHERE M.water=1 AND L.river=1

我正在考虑添加一个列,例如设施,它将包含一个 json 设施字符串作为编号键,例如 [1,3,4,12] 每个数字代表一个可用设施,另一列用于位置相同的格式,例如 [1,3,5]

这确实让我可以在不添加额外列的情况下减小表大小并添加额外的设施或位置,但在性能方面这是一个好主意吗?

即搜索现在类似于

SELECT id FROM tblSites WHERE(设施 LIKE '%1,%' AND 设施 LIKE '%4,%' AND 位置 LIKE '%1,%')

是否有更好的查询可用于查看该字段是否包含数组字符串中的键号?

【问题讨论】:

  • where条件see this documents中使用JSON类型列并使用JSON_CONTAINS@lifeson等函数
  • 你让情况变得更糟了。将您的一对多关系建模为正确的一对多关系,而不是将它们拆分为列或包含 JSON 字符串。

标签: mysql json database


【解决方案1】:

您的 WHERE 子句在使用 like '%1,%' 时无法正常工作。 如果您的 facilities 是字符串(TEXTvarchar ...)并且在字符串 json 数组 [2,3,12,21,300] 中搜索值,where facilities like '%1,%' 为真并与“21”匹配,如果你想找到where facilities like '%300,%' 它永远不会匹配提到的数组!

因此,以字符串格式搜索json数组被拒绝。

如果你的 MySQL 版本大于 5.7.8,它支持原生 json 作为 JSON 列类型。

当您将数据存储在 MySQL 的 json 列中时(JSON_INSERT()),您可以在 where 中通过 WHERE JSON_CONTAINS(facilities,1) 搜索它们

但是最好的解决方案是按照@Robby 在您的问题下方评论的那样重新设计您的表结构和关系。

【讨论】:

  • %1,%' 与 21 不匹配!!注意逗号。我的数据库版本不支持 JSON 数据类型。 JSON 数据类型显然是 MySQL 数据类型选项的新增功能,具有支持数据类型的新功能。如果这些新功能没有带来好处,为什么还要添加它们?
  • 我重复 %1,% match '21,' 在那个字符串中,很明显!如果您喜欢使用类似操作,请创建逗号分隔值,在字符串的开头和结尾有额外的 ',' 。因此,如果您的设施是“,2,7,8,21”,那么 '%,id,%' 是安全使用。
  • 如果你有很多行和很多设施和位置的表,你应该使用另一个表来存储设施和位置与tblSites的关系。如果您需要任何建议或帮助,请告诉我。 但是如果您想使用问题中提到的 tblSites 中的设施和位置列,也请告诉我们。谢谢@lifeson
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多