Sorry, I work better from seeing one or more proposals, complete with CREATE TABLEs, their relationships, and some numbers about how common items are.
A many-to-many relationship is usually embodied in a table something like
CREATE TABLE many2many (
foo_id INT UNSIGNED ...,
bar_id INT UNSIGNED ...,
(optionally, some info on the relationship)
PRIMARY KEY(foo_id, bar_id),
INDEX(bar_id, foo_id)
) ENGINE=InnoDB;
Where foo_id and bar_id are the ids into two (or one?) table.
A "hierarchy" is often done this way, and involves "self joins":
CREATE TABLE stuff (
id INT UNSIGNED ...,
parent_id INT UNSIGNED ..., -- matches some id in same table (perhaps NULL for the 'root')
... other fields ...
PRIMARY KEY(id),
INDEX(parent_id) -- often handy, eg for finding all children
) ENGINE=InnoDB;
That is a DAG (Directed Acyclic Graph). If there are loops in the graph, you probably need many2many, instead.