我有一个列出露营地的数据库 有一个主表tblSites包含唯一的数据,例如名称,坐标,地址等,还包括每个设施的列,例如,厕所,水,淋浴,电力等,这些只是1 =是,Null =否 这将通过类似
的搜索来搜索SELECT id FROM tblSites WHERE Water = 1 AND Toilets = 1
还有另一个相关的表tblLocations包含位置类型(即靠近海边,农村,山脉,河边等)。 这意味着该表有很多列,如果我想添加新类别,则不允许轻松更新。 这将包含在像这样的搜索中
SELECT M.id,L. * FROM tblSites AS M. 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 location LIKE'%1,%& #39)
是否有更好的查询可用于查看字段是否包含数组字符串中的键编号?
答案 0 :(得分:0)
使用类似'%1,%'时,WHERE
子句无法正常工作。
如果您的facilities
是字符串(TEXT
或varchar
...)并且在弦乐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在你的问题下面评论一样。