Moa*_*oak 13 php mysql database optimization search
我有两张桌子
A:
plant_ID | name.
1 | tree
2 | shrubbery
20 | notashrubbery
Run Code Online (Sandbox Code Playgroud)
B:
area_ID | name | plants
1 | forrest | *needhelphere*
Run Code Online (Sandbox Code Playgroud)
现在我希望该区域按特定顺序存储任意数量的植物,并且一些植物可能会出现多次:例如2,20,1,2,2,20,1
什么是存储这一系列植物的最有效方法?
记住我需要这样做,以便如果我执行搜索以找到具有植物2的区域,我不会得到例如1,20,232,12,20的区域(带有前导0的垫?)什么是查询为了那个原因?
如果它有帮助,我们假设我有一个不超过99999999个不同植物的数据库.是的,这个问题与植物没有任何关系......
奖金问题 是时候离开MySQL吗?是否有更好的数据库来管理这个?
Mat*_*chu 26
如果您要通过森林和植物进行搜索,听起来您将从全面的多对多关系中受益.抛弃您的plants列,并创建一个全新的areas_plants表(或任何您想要调用它的表)来关联这两个表.
如果区域1有植物1和2,区域2有植物2和3,那么你的areas_plants桌子看起来像这样:
area_id | plant_id | sort_idx
-----------------------------
1 | 1 | 0
1 | 2 | 1
2 | 2 | 0
2 | 3 | 1
Run Code Online (Sandbox Code Playgroud)
然后,您可以从任意一侧查找关系,并使用简单的JOIN从任一表中获取相关数据.不需要在LIKE条件下弄清楚它是否在列表中,等等,等等.我去过遗留数据库.没有什么好玩的.使用SQL发挥其最大潜力.
这个怎么样:
表:植物
plant_ID | name
1 | tree
2 | shrubbery
20 | notashrubbery
Run Code Online (Sandbox Code Playgroud)
表:区域
area_ID | name
1 | forest
Run Code Online (Sandbox Code Playgroud)
table:area_plant_map
area_ID | plant_ID | sequence
1 | 1 | 0
1 | 2 | 1
1 | 20 | 2
Run Code Online (Sandbox Code Playgroud)
这是标准的标准化方法(使用映射表).
要找到所有带灌木的区域(植物2),请执行以下操作:
SELECT *
FROM areas
INNER JOIN area_plant_map ON areas.area_ID = area_plant_map.area_ID
WHERE plant_ID = 2
Run Code Online (Sandbox Code Playgroud)