什么是在MySQL列中存储整数数组的最有效方法?

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发挥其最大潜力.

  • 这(引入连接表)是问题的正确解决方案.我唯一要添加的是sort_idx列,用于保留问题中请求的工厂订单. (7认同)

Mat*_*ves 7

这个怎么样:

表:植物

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)

  • 我读了"shubbery",现在有了倪骑士!小品跑在我脑海里...... (3认同)