2017-02-28 78 views
0

我有一个数据库列出的营地 有包含独特的数据,例如名称的主表tblSites,坐标,地址等,也包括每个设施如,空调,水,淋浴柱,电等在那里,这些都只是1 =是,空=无 这就要通过一些搜索类似数据库设计 - 使用JSON来存储信息

SELECT ID FROM tblSites在水= 1和厕所= 1

有包含另一个相关的表tblLocations位置类型(即靠近大海,农村,山区,河流等) 这意味着该表有很多列,并且不允许f或者如果我想添加一个新的类别,可以轻松更新。 这将被包括在如搜索这个

SELECT M.id,L. * FROM tblSites为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%' 和设施LIKE '%4%' 和位置,如 '%1%')

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

+0

使用JSON类型列在'where'条件[见本文件(https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html)和使用功能,如' JSON_CONTAINS' @lifeson – MohaMad

+1

你的情况更糟糕。将您的一对多关系建模为适当的一对多关系,而不是通过将它们拆分为列或包含JSON字符串。 –

回答

-1

如果您的mySql版本适合您,您可以使用JSON数据类型。你可以在mysl站点找到文档。

0

同时使用LIKE '%1%' 你WHERE子句不工作的罚款。 如果您的facilities是字符串(TEXTvarchar ...)并在弦乐阵列[2,3,12,21,300]中搜索值,则where facilities like '%1,%'为真,并且与'21'匹配,并且如果您想查找where facilities like '%300,%'它永远不会匹配那提到数组!

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

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

当存储在MySQL(由JSON_INSERT())以JSON列数据你可以通过WHERE JSON_CONTAINS(facilities,1)

最好的解决办法是重新设计你的表结构和关系作为@寻找他们where Robby在你的问题下面评论。

+0

%1,%'不匹配21!注意逗号。我的数据库版本不支持JSON数据类型。 JSON数据类型显然是MySQL数据类型选项的一个新增功能,具有支持数据类型的新功能。如果这些新功能不增加收益,为什么要添加? – lifeson

+0

我在该字符串中重复%1,%匹配'21',这很清楚!如果你喜欢使用类似的操作,创建逗号分隔值,在字符串的开始和结尾有额外的','。所以如果你的设施是“2,7,8,21”,那么'%,id,%'就是安全使用。 – MohaMad

+0

如果你有许多行,许多设施和位置的表,你应该使用另一个表来存储设施和位置关系到'tblSites'。如果您想要这样的建议或帮助,请告诉我。 **但是**如果您想在问题中提到的使用tblSites中的设施和位置列,请告诉我们。谢谢@lifeson – MohaMad