我有一个选择菜单,用户可以在其中选择特定功能,然后根据他们选择的内容,出现一个带有新选项的新选择菜单。根据选择的内容,该过程可以重复多次。
例如,如果选择菜单显示以下项目:apple, mango, orange.
然后用户选择apple
:他们将获得与苹果相关的三个附加选项– brown, red, green.
例如,如果用户选择orange
,他们可能会看到{{1} }请注意,红色显示两次。
我的主要问题是有一个很好的追踪方法。
我有两个表-red, orange.
和features
feature_group.
的列:feature_group
,id
name
的列:features
,id
,group_id
,name
如果我们回到上一个示例,
我当前将这些选项存储在links
部分中。
links
表:
feature_group
| id | name |
|----|--------|
| 1 | Fruit |
| 2 | Colour |
| 3 | Taste |
表:
features
如您所见,在{strong>相同表中,| id | group_id | name | links |
|----|----------|--------|-----------|
| 1 | 1 | Apple | |
| 2 | 1 | Mango | |
| 3 | 1 | Orange | |
| 4 | 2 | Red | 1,2,3 |
| 5 | 2 | Green | 1,2 |
| 6 | 2 | Orange | 3 |
| 7 | 3 | Slicy | 1,2;1,2,3 |
| 8 | 3 | Okay | 1,2,3,4 |
| 9 | 3 | Bad | 2,4 |
列包含links
中的id
。因此,例如,当用户选择任何选项features
Red
的第四行就可见
同样,如果他们没有选择Apple, Mango, Orange.
作为第一个选项,而选择了Bad
作为第二个选项,则他们不能选择Mango
作为第三选项。
Red
也用于包含其他选项对。
我希望这是有道理的。
这是我的表结构。在代码中,我将其作为数组:
;
我认为这不是最好的方法。尤其是如果以后要添加更多内容,那么我必须对数据进行大量修改,这可能会很麻烦。
如何解决此问题?
答案 0 :(得分:1)
由于您想拥有尽可能深入的自由,因此以下解决方案可能会起作用:
Table: features
| id | name |
|----|-------|
| 1 | Apple |
| 2 | Red |
| 3 | Green |
| 4 | Sweet |
| 5 | Sour |
| 6 | Cake |
| 7 | Cider |
Table: feature_parent_child // maybe you have a better name
| parent_id | child_id |
|-----------|----------|
| 1 | 2 |
| 1 | 3 |
| 2 | 4 |
| 3 | 5 |
| 4 | 6 |
| 5 | 7 |
如果我们遵循我们的关系,我们最终会得到:
Apple -> Red -> Sweet -> Cake -> ...
Apple -> Green -> Sour -> Cider -> ...
这样,我们可以深入所需的深度。同样,我们可以将其他功能的子功能作为“根”功能:
Cake -> Sugar -> Sweet -> Apple
Cider -> Party -> Happy -> Cake -> Birthday
难度正在管理功能的数量。
评论后更新
由于无限的关卡深度,一次加载所有选项并不明智。因此,我们被迫通过执行单独的请求来加载下一个功能。
首先,我们可以返回具有给定功能的所有子级:
id 1
。id 1
的所有子项,响应为[2, 3]
。id 2
。id 2
的所有子项,响应为[4]
。我认为,如果我误会了,请原谅,也有可能让每个功能都由不同的孩子来照顾前任父母。但是,这需要更多的逻辑。
示例:
Apple -> Red
Apple -> Green
Red -> Apple -> Tasty
Red -> Apple -> Cake
我们可以看到Apple
有两个子功能Red
和Green
。但是,一旦我们以Red
为父母,我们就会发现Apple
具有两个不同的功能,Tasty
和Cake
。需要执行以下过程。
Red
。Red
为父级的特征。在给定示例中为Apple
。Apple
。Apple
为父,所有Apple
以Red
为父的事物。分别是Tast
和Cake
。